每隔一二年就要用一次 WORD 或其它 MSOffice 组件,好多次了,每次都忘的一干二净,从头google,这次又要用,顺便记下来,以备不时之需,同时分享给大家。开发环境 WIN7-X64, VC2010, MSOffice2010。
1. 在VC2010项目名称上右击,选择类向导...
2.在右上角的添加类中选择“类库中的MFC类”
3. 在新对话框中选择文件,点击右边的“...”按钮,按图示选择MSWORD.OLD文件。
4. 按需要选择一些常用的类,完成
5. 把新生成的 .h 文件顶部的 #import "E:\\TTMv8\\Debug\\MSWORD.OLB" no_namespace 这一行注释掉,否则编译时会出现一大堆错误,网上有别的解决办法,我觉得注掉这个办法最好。出现的错误代码如下:
//#import "E:\\TTMv8\\Debug\\MSWORD.OLB" no_namespace
/* 编译时出一大堆错,把上面这一句注消就好了!!!!!!!,可能还能保证各word版本的兼容性
1>e:\ttmv8\ttmv8\capplication.h(3): warning C4278: “ExitWindows”: 类型库“E:\\TTMv8\\Debug\\MSWORD.OLB”中的标识符已经是宏;使用“rename”限定符
1>e:\ttmv8\ttmv8\capplication.h(3): error C2872: “Font”: 不明确的符号
1> 可能是“c:\program files (x86)\microsoft visual studio 10.0\vc\include\comdef.h(312) : Font”
1> 或 “c:\program files (x86)\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(244) : Gdiplus::Font”
1>e:\ttmv8\ttmv8\capplication.h(3): error C2872: “Font”: 不明确的符号
1> 可能是“c:\program files (x86)\microsoft visual studio 10.0\vc\include\comdef.h(312) : Font”
1> 或 “c:\program files (x86)\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(244) : Gdiplus::Font”
*/
6. 添加代码,以下是实际使用的代码,功能是用指定的 word 模板新建一个文档,在预设的书签位置插入文字和图片。
// 将当前所有打开的图像窗口导出到word中, 最多输出6个
- void ViewImagesFrame::OnReportimg()
- {
- CDocument0 cdoc; // Word 文档类
- if( m_bViewmax ) // 最大化时导出一幅活动图像
- {
- // word 图表报告模板文件
- CString str;
- str.Format( L"%s\\imgreport1.dotx", theApp.appPath); // 取对应模板
- if( ! wordopen( str, cdoc ) )
- return;
- // 插入文字信息
- insertinfo( cdoc );
- // 插入图像信息
- str.Format(L"%s/reportimg0.png", theApp.appPath);
- m_pView->OnExportimg( str );
- insertimg(str, cdoc, L"v8img_image0");
- }
- else //否则
- {
- int n = m_arViews.GetSize();
- if( !n )
- return;
- if( n > 6 )
- n = 6; //最多输出6个
- // word 图表报告模板文件
- CString str;
- str.Format( L"%s\\imgreport%i.dotx", theApp.appPath, n); // 取对应模板
- if( ! wordopen( str, cdoc ) )
- return;
- // 插入文字信息
- insertinfo( cdoc );
- // 插入图像信息
- for( int i = 0; i < n; i++ )
- {
- str.Format(L"%s/reportimg%i.png", theApp.appPath, i);
- m_arViews[i]->OnExportimg( str );
- CString str2;
- str2.Format(L"v8img_image%i", i);
- insertimg(str, cdoc, str2);
- }
- }
- }
- // 将当前所有打开的图像窗口导出到word中, 最多输出6个, LPCTSTR dotxname 指定的模板, CDocument0 &cdoc out 返回新建的文档。
- bool ViewImagesFrame::wordopen( LPCTSTR dotxname, CDocument0 &cdoc )
- {
- COleVariant
- covTrue((short)TRUE),
- covFalse((short)FALSE),
- covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
- //covFileName(_T("E:\\temp\\ac\\Debug\\imgreport.dotx"));
- covFileName(dotxname);
- CApplication capp;
- CDocuments cdocs;
- if(FALSE == capp.CreateDispatch(_T("word.application"), NULL)){
- return false;
- }
- capp.put_Visible(TRUE);
- CString version = capp.get_Version();
- CString name = capp.get_Name();
- CString cap1 = capp.get_Caption();
- LPDISPATCH disp = capp.get_Documents();
- if(NULL == disp){
- return false;
- }
- cdocs.AttachDispatch(disp);
- if(NULL == cdocs.m_lpDispatch){
- return false;
- }
- cdoc.AttachDispatch(cdocs.Add(
- covFileName,
- covFalse,
- covFalse,
- covTrue
- ));
- if(NULL == cdoc.m_lpDispatch){
- return false;
- }
- return true;
- }
- // 向word中加入文件信息
- void ViewImagesFrame::insertinfo( CDocument0 &cdoc )
- {
- myimg * pim = m_arViews[0]->pimg; // 取第一个图像的信息
- insertstr(cdoc, L"v8img_name", pim->name );
- CString str;
- str.Format(L"%i", pim->m_nAge);
- insertstr(cdoc, L"v8img_age", str );
- insertstr(cdoc, L"v8img_sex", pim->m_strSex );
- insertstr(cdoc, L"v8img_subject", pim->subject ); // 检查方法
- str = pim->scanday.Format( _T("%Y-%m-%d") );
- insertstr(cdoc, L"v8img_scandate", str ); // 扫描日期
- insertstr(cdoc, L"v8img_sick", pim->sickid ); // 扫描编号
- Cdasys ds;
- insertstr(cdoc, L"v8img_company", ds.getvalue(L"CompanyName") ); // 单位
- insertstr(cdoc, L"v8img_address", ds.getvalue(L"CompanyAddress") ); // 单位
- insertstr(cdoc, L"v8img_telephone", ds.getvalue(L"CompanyTelephone") ); // 单位
- }
- // 插入字符串, CDocument0 &cdoc 文档, LPCTSTR strMark 书签名, LPCTSTR strValue,插入的值
- void ViewImagesFrame::insertstr( CDocument0 &cdoc, LPCTSTR strMark, LPCTSTR strValue )
- {
- CBookmarks bms = cdoc.get_Bookmarks();
- COleVariant bm( strMark );
- CBookmark0 bk = bms.Item(bm);
- CRange rang = bk.get_Range();
- rang.InsertAfter(strValue);
- }
- // 向word中加入图像, PCTSTR imgname 图像文件名, CDocument0 &cdoc 文档word, LPCTSTR mark 书签名
- void ViewImagesFrame::insertimg( LPCTSTR imgname, CDocument0 &cdoc, LPCTSTR mark )
- {
- CBookmarks bms = cdoc.get_Bookmarks();
- COleVariant bm0( mark );
- CBookmark0 bk = bms.Item(bm0);
- CRange rang = bk.get_Range();
- CnlineShapes shape = cdoc.get_InlineShapes();
- shape.AddPicture(imgname, COleVariant((short)FALSE), COleVariant((short)TRUE), &_variant_t(rang));
- }