当前位置:首页>>开发编程>>综合开发>>新闻内容
使用VC对Office文档进行操作
作者: 发布时间:2005-9-7 9:34:31 文章来源:

例2:

  给企业开发的项目中,客户经常要求将数据汇总显示并打印。站在程序员的立场上,简单数据的汇总打印可以采用VB自带报表,对复杂的数据用水晶报表或第三方打印控件。在企业中,汇总数据另一个目的是为了便于交流和共享资源,报表的格式通常固定,内容可以自己调整,他们对 Excel 和 Word 情有独钟。
  刚完成的项目中,客户要求将汇总的数据以三种方式进行显示和打印:AutoCad、Excel 和 Word 文档中。前两种方式网上资源很多,对 Word 文档我找到例子不是很多。由于需要和 AutoCad 开发程序结合,不能将 Word 文档以 OLE 的方式 嵌入到程序中,文档只能在内存中形成,这将占用大量的CPU资源,另开一个线程进行处理,线程间以发送消息的方式进行通信。

  首先在VC引入Word, 对格式相同的地方一定使用模版的方式进行处理,这可以大大的提高运行速度,Word中的模版为*.dot。加载模版的代码为:

  sDocs=sApp.GetDocuments();
   sDocs.AttachDispatch(sApp.GetDocuments(),true);
   COleVariant vFalse((long)0),vTrue((long)1);
   sDoc.AttachDispatch(sDocs.Add(COleVariant(_variant_t(strFileName)), vFalse,vFalse, vTrue));

  需要注意的是,如果Word中使用到表格,VBA录制的全是Selection对象的处理方法,在VC中使用Selection对象的MoveUp和MoveDown函数时会出现不确定现象(如果你知道为什么的话请告诉我)。如果你需要绘制表格,不要用程序来动态形成,绘制表格的代码是很繁琐的,而且在页眉中绘制单元格是很难控制的。可以先在模版中绘出你要的表格格式,然后用程序复制单元格或者直接使用模版中的单元格。由于我做的项目表格的行数不确定,我采用的是复制单元格的方式(速度比较慢,谁有更好的方法?)。

  剩下的处理流程,就是你想做什么操作,先在Word中录制一段宏,然后查看其VBA代码,并将其转化到Vc程序中。这就看你Word使用的熟练程度了,例如如何把不同页的页眉页脚设置不同,如何得到当前页的页数以及总的文档的页数,具体可以参考程序。

  VC中也可以像Excel中调用模版中存在的宏,代码如下:
   VARIANT vtMissing ;vtMissing.vt =VT_ERROR;
   vtMissing.scode =DISP_E_PARAMNOTFOUND;
   sApp.Run("AddCell",&vtMissing,&vtMissing,&vtMissing,
   &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
   &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
   &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
   &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing);


例3:
#include
#include
#pragma warning (disable:4146 4192 4786 4081)
#define USE_OFFICEXP 1

#ifdef USE_OFFICEXP
#import "C:\Program Files\Common Files\Microsoft Shared\Office10\MSO.DLL"
#import "c:\\Program Files\\Common Files\Microsoft Shared\\VBA\VBA6\VBE6EXT.olb"
#import "c:\Program Files\Microsoft Office\Office10\MSWORD.olb" rename("ExitWindows","ExitWindowsEx")
#import "c:\Program Files\Microsoft Office\Office10\office/9.shtml' target='_blank' class='article'>excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
#else
#import "c:\Program Files\Microsoft Office\Office\MSO9.dll"
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" no_namespace
#import "c:\Program Files\Microsoft Office\Office\MSWORD9.OLB" rename("ExitWindows","_ExitWindows")
#import "c:\Program Files\Microsoft Office\Office\excel9.olb" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
#endif
int main(int argc, char* argv[])
{

::CoInitialize(NULL);
CLSID clsid;
#if 1
CLSIDFromProgID(L"Word.Application", &clsid);
Word::_ApplicationPtr pApp;
//pApp.GetActiveObject (clsid);
pApp.CreateInstance (clsid,NULL);
pApp ->PutVisible (VARIANT_TRUE);
_variant_t bstrFileName = "C:\\Project\\Îĵµ\\ftp•þÎñÉè¼Æ.doc";
pApp ->GetDocuments() ->Open (&bstrFileName);
//pApp ->GetDocuments() ->Add();
Word::_DocumentPtr pWordDocument =pApp-> GetActiveDocument();
Word::SelectionPtr pSelection = pApp ->GetSelection();
Word::ParagraphsPtr pParagraphs = pWordDocument->GetParagraphs ();
long lParaCnt = pParagraphs ->GetCount ();
Word::ParagraphPtr pTemp;
Word::RangePtr pRange;
for (long iLoop =1;iLoop{
pTemp = pParagraphs->Item (iLoop);
pRange = pTemp ->GetRange ();
printf("%s\n",(char*)pRange ->GetText());
printf("%s\n",(char*)(_bstr_t)pTemp->GetStyle ());
}

//pApp ->GetDocuments() ->Close ();
pApp ->Quit ();
#endif
#if 0
_variant_t varItem((long)1);
CLSIDFromProgID(L"Excel.Application", &clsid);
Excel::_ApplicationPtr pApp;
pApp .CreateInstance (clsid,NULL);
pApp ->PutVisible (0,VARIANT_TRUE);

Excel::_WorkbookPtr pWorkbook = pApp ->GetWorkbooks () ->Add ();
Excel::_WorksheetPtr pSheet = pWorkbook ->GetWorksheets () ->GetItem (varItem);
Excel::RangePtr pRange = pSheet ->GetUsedRange(0);
int iColCnt = pRange ->GetColumns() ->GetCount();
printf("used columns is %d\n",iColCnt);
int iRowCnt = pRange ->GetRows() ->GetCount();
printf("used rows is %d\n",iRowCnt);
pRange = pSheet ->GetRange(OLESTR("A1"));
pRange ->Value2 = OLESTR("zheng017");
pSheet ->GetRows ()-
Excel::InteriorPtr pInterior= pRange ->GetInterior ();
varItem.intVal = 0xff0000;
pInterior ->PutColor (varItem);
pSheet ->PrintPreview ();
#endif
::CoUninitialize();
return 0;
}


[首页]    [上一页]    [下一页]    [末页]    
最新更新
·wml中页面自动跳转的实现方法
·Alexa排名数据接口的简要介绍
·利用U盘进行软件加密的方法(VB)
·优秀程序员的十个习惯
·项目管理:如何逃离垃圾客户
·QQ2009去广告部分核心源代码
·让程序更容易理解:13个代码注释的小技
·nx1和nx2后缀名是什么数据库文件?
·正则表达式符号解释大全
·什么是RIA?介绍几种RIA客户端开发技术
相关信息
·普通光盘能刻360分钟的KVCD影片
·互联网周刊:会员利益是VC经营根本
·Visual C# 2005如何指定.EXE的输出位置
·用VC实现对超长数据库字段的操作
·Svchost.exe和Explorer.exe两种进程应用
· VC编程技巧及方法20种
·在VC中为应用程序添加图形超链接功能
·利用VC打造自己的资源浏览器
·巧用Nero来做数码相片VCD
画心
愚爱
偏爱
火苗
白狐
画沙
犯错
歌曲
传奇
稻香
小酒窝
狮子座
小情歌
全是爱
棉花糖
海豚音
我相信
甩葱歌
这叫爱
shero
走天涯
琉璃月
Nobody
我爱他
套马杆
爱是你我
最后一次
少女时代
灰色头像
断桥残雪
美了美了
狼的诱惑
我很快乐
星月神话
心痛2009
爱丫爱丫
半城烟沙
旗开得胜
郎的诱惑
爱情买卖
2010等你来
我叫小沈阳
i miss you
姑娘我爱你
我们都一样
其实很寂寞
我爱雨夜花
变心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK绷
贝多芬的悲伤
哥只是个传说
丢了幸福的猪
找个人来爱我
要嫁就嫁灰太狼
如果这就是爱情
我们没有在一起
寂寞在唱什么歌
斯琴高丽的伤心
别在我离开之前离开
不是因为寂寞才想你
爱上你等于爱上了错
在心里从此永远有个你
一个人的寂寞两个人的错