VC利用COM接口操作Word总结



VC利用COM接口操作Word总结


 
1、初始化COM库
2、利用COM接口提供的函数,打开默认的模版文档。对Word进行读写等操作,下面代码包括写入文本,在表格中写入文本,实现控制页数,查找特定字符、打印等操作。
3.转载过来,先学习着
 

void CWordDlg::OnBnClickedButtonCreate()
{
 // TODO: Add your control notification handler code here
 //初始化COM库
 AfxOleInit();
 
 //定义变量
 COleVariant varstrNull("");
 COleVariant varTrue(short(1),VT_BOOL);
 COleVariant varFalse(short(0),VT_BOOL);
 COleVariant vTure(SHORT(TRUE)), vFalse(SHORT(FALSE));
 COleVariant vE(_T(""));
 COleVariant v0(SHORT(0)), v1(SHORT(1)), v2(SHORT(2)), v5(SHORT(5)), v6(SHORT(6)), v12(SHORT(12)), v22(SHORT(22));

 CString strPath = "..\\Perforation.tdt";

 //根据模版创建Word文档
 ExportMessage(1);
 CApplication app;
 app.CreateDispatch("Word.Application");

 app.put_Visible(TRUE);

 //word文档
 CDocuments docs = app.get_Documents();
 docs.AttachDispatch(app.get_Documents()); //将Documents类对象m_Docs和Idispatch接口关联起来;

 //打开文档
 docs.Open2000(COleVariant(strPath),varFalse,varFalse,varFalse,
  varstrNull,varstrNull,varFalse,varstrNull,
  varstrNull,varTrue,varTrue,varTrue);
 
 ExportMessage(2);
 CDocument0 doc0 = app.get_ActiveDocument();
 CSelection select = app.get_Selection();
 //写入文本
 select.TypeText("The First Table!");

 //选择表格
 CTables0 tabs = doc0.get_Tables();
 CTable0 tab1 = tabs.Item(1);
 CTable0 tab2 = tabs.Item(2);

 CCell0 cell =  tab1.Cell(1,2);
 cell.Select();
 select.TypeText("12");

 cell =  tab1.Cell(1,6);
 cell.Select();
 select.TypeText("16");

 cell =  tab1.Cell(4,2);
 cell.Select();
 select.TypeText("42");

 //获得当前页信息
 COleVariant vAllPag(select.get_Information(4));
 int nAllPag = vAllPag.intVal;
 int nCurPag = nAllPag;
 
 CString strData;
 int i,j;
 i=1;
 while(nAllPag >= nCurPag)
 {
  for(j=1;j<=13;j++)
  {
   cell = tab2.Cell(i,j);
   cell.Select();

   strData.Format("%d",i);
   select.TypeText(strData);  //输入数据
   select.MoveRight(v1,v1,v0);  //右移
  }
  
  select.Collapse(v1);    //换行
  COleVariant vAllPagNew(select.get_Information(4));
  nCurPag = vAllPagNew.intVal;

  i++;
 }

 //查找END字符,删除行
 COleVariant vEnd(_T("END")),vT(SHORT(TRUE)), vF(SHORT(FALSE));
 
 CDocument0 Fnd(select.get_Find());  //Fnd和select相关联

 Fnd.Exe(vEnd, vF, vF, vF, vF, vF, vT, v1, vF, COleVariant(""), vT, vF, vF, vF, vF);
 select.MoveRight(v1,v1,v0);

 select.TypeBackspace();
 select.TypeBackspace();
 
 //释放对象
 cell.ReleaseDispatch();
 tab1.ReleaseDispatch();
 tab2.ReleaseDispatch();
 tabs.ReleaseDispatch();

 //保存word
 ExportMessage(3);

 CFile file;
 CString strSaveFile;
 BOOL bUse = TRUE;
 while(bUse)
 {
  CFileDialog fileDialog(FALSE);
  fileDialog.m_ofn.lpstrTitle = "保存Word文档";
  fileDialog.m_ofn.lpstrFilter = "Word Document(*.doc)\0*.doc\0All Files(*.*)\0*.*\0\0";
  fileDialog.m_ofn.lpstrDefExt = ".doc";

  if(IDOK == fileDialog.DoModal())
  {
   strSaveFile = fileDialog.GetPathName();
   if(file.Open(strSaveFile, CFile::modeWrite | CFile::modeCreate))
   {
    file.Close();
    bUse = FALSE;
    doc0.SaveAs(COleVariant(strSaveFile), v0, vF, vE, vF, vE, vF, vF, vF, vF, vF, vF, vF, vF, vF, vF);
   }
   else
   {
    bUse = TRUE;
    AfxMessageBox("文件正在编辑,无法进行存储!");
   }
  }
  else
  {
   bUse = FALSE;
   AfxMessageBox("取消存储!如要使用数据,请再次输出!");
  }
 }

 //打印
 ExportMessage(4);
 if(IsPrint())
 {
  ExportMessage(5);
  ShellExecute(NULL,"print",strSaveFile,"","",SW_HIDE);
 }

 select.ReleaseDispatch();
 doc0.ReleaseDispatch();
 docs.ReleaseDispatch();
 app.Quit(vFalse,  vFalse, vFalse);
 app.ReleaseDispatch();

 ExportMessage(0);
}


void CWordDlg::ExportMessage(int nType)
{
 CString strMessage;
 switch(nType)
 {
 case 0:
  strMessage = "就绪";
  break;
 case 1:
  strMessage = "创建Word文档...";
  break;
 case 2:
  strMessage = "写入数据...";
  break;
 case 3:
  strMessage = "保存Word文档...";
  break;
 case 4:
  strMessage = "正在检查当前打印机是否可用 ...";
  break;
 case 5:
  strMessage = "打印Word文档...";
  break;
 default:
  break;
 }

 GetDlgItem(IDC_MESSAGE)->SetWindowText(strMessage);
}

BOOL CWordDlg::IsPrint()
{
 CApplication App;
 COleVariant vF(SHORT(FALSE));
 if(!App.CreateDispatch("Word.Application"))
 {
  AfxMessageBox("当前打印机安装有问题,无法打印!");
  return FALSE;
 }
 CString strPrt(App.get_ActivePrinter());
 strPrt = strPrt.Left(strPrt.ReverseFind('on')-1);
 strPrt.TrimRight();
 App.Quit( vF, vF, vF);
 HANDLE hPrt;
 if(!OpenPrinter(strPrt.GetBuffer(), &hPrt, NULL))
 {
  AfxMessageBox("当前打印机安装有问题,无法打印!");
  return FALSE;
 }
 return ClosePrinter(hPrt);
} 



 


©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值