C++、MFC往Word模板中添加图片

C++、MFC往Word模板中添加图片


  新建一个基于对话框的MFC应用程序工程,将对话框界面设置成图1所示。
图1

图1
   通过类向导添加所有的接口,使VS与Word建立联系。   
   “类向导”界面如图2,在 “添加类”处选择“类型库中的MFC类(T)...”,弹出图3所示界面,选择从文件中添加类。
图2
图3
   找到计算机中Word安装路径中“MSWORD.OLB”文件,如图4所示,单击“打开”按钮,则“接口”窗口出现Word相关接口,如图5 所示。
图4
图5
   可以根据自己的需要添加接口,往Word模板中添加图片则需要用到_Application、_Document、Cell、Documents、Inlineshape、Inlineshapes、Selection、Table和Tables共9个接口,找到接口并点击图5中 “>”符号,则生成相应的类,CApplication、CDocument0、CCell、CDocuments、Cnlineshape、Cnlineshapes、CSelection、CTable0 和CTables0共9个类,如图6所示。
图6
   单击“完成”、“应用”之后,在“解决方案资源管理器”可以看见生成了相应的头文件,如图7所示;在“类视图”可以看见生成了相应的类,如图8所示。
图7

在这里插入图片描述

图8
   双击打开图7所示生成的各头文件,可见第三行的代码#import "D:\\Microsoft Office\\Office12\\MSWORD.OLB" no_namespace,如图9为CApplication.h中的此代码,将其注释掉,否则无法编译成功。

在这里插入图片描述

图9
   找到与项目同名的源文件,这里是AddPictureToWord.cpp,在图10所示位置添加下面这5行代码。
if (!AfxOleInit())
{
	AfxMessageBox(_T("无法初始化COM的动态链接库!"));
	return FALSE;
}

在这里插入图片描述

图10
   双击图1中的“生成报告”按钮,将类向导生成的所有头文件添加到弹出的源文件中,如图11所示。
图11
   在双击图1中的“生成报告”按钮弹出的源文件中添加代码,代码在本文末已给出。
   代码添加后会出现图12所示,获取路径的错误,在项目-属性-配置属性-常规-字符集中,将项目的字符集改为“使用多字节字符集”,如图13所示。则该错误得到解决。
图12
图13
   之后就可以生产解决方案了,生成解决方案时可以看见,出现了如图14所示错误,在项目-属性-配置属性-C/C++-预处理器-预处理器定义中,添加“_CRT_SECURE_NO_WARNINGS”即可,如图15所示。
图14
图15
   在生成得到的解决方案文件夹中有.exe、.ilk和.pdb三个文件,在该文件夹中放入Word模板“Template.dot”和欲添加到模板中的图片(此处图片放在Result文件夹中),如图16所示。

在这里插入图片描述

图16
   此时进行启动调试则可在上述文件夹中得到添加了图片的Word文档,调试结果如图17和图18所示。

在这里插入图片描述

图17

在这里插入图片描述

图18
   void CAddPictureToWordDlg::OnBnClickedButton1()中的代码如下:  
// 获取应用当前Debug路径
char fileName[MAX_PATH];
GetModuleFileName(NULL, fileName, MAX_PATH);
char dir[260];
char dirver[100];
_splitpath(fileName, dirver, dir, NULL, NULL);
CString strAppPath = dirver;
strAppPath += dir;
//CString strAppPath = _T("D:\\");

COleVariant   covZero((short)0),
	covTrue((short)TRUE),
	covFalse((short)FALSE),
	covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
	covDocxType((short)0);

// 定义word变量
CApplication wordApp; // wordApp
CDocuments docxs; // docxs
CDocument0 docx, docx_active; // docx
if (!wordApp.CreateDispatch(_T("Word.Application"))) // 实例化wordApp,必须有初始化
{
	AfxMessageBox(_T("本机没有安装word产品!"));
	return;
}
else
{
	wordApp.put_Visible(FALSE);  // 设置文档开始不可见
	CString wordVersion = wordApp.get_Version();  // 获得当前word的版本,比如word2010为14.0,2013为15.0
	docxs = wordApp.get_Documents();     // 得到docxs
	docx = docxs.Add(covOptional, covOptional, covOptional, covOptional);  // 添加一个docx
	CComVariant tpl(strAppPath + _T("\\Template.dot")), Visble, DocxType(0), NewTemplate(false);
	docx = docxs.Add(&tpl, &NewTemplate, &DocxType, &Visble);

	if (NULL == docx.m_lpDispatch)
		return;

	CSelection wordSelection = wordApp.get_Selection();// 声明一个CSelection对象,并实例化

	// 定义table和cell变量
	CTable0 table;
	CTables0 tables;
	CCell cell;

	//填写表格
	wordSelection = wordApp.get_Selection();  //获取光标位置,一般在文首
	wordSelection.MoveDown(COleVariant((short)5), COleVariant((short)2), COleVariant((short)0));
	tables = docx.get_Tables();
	table = tables.Item(tables.get_Count());

	//插入图片
	//wordSelection.TypeParagraph();   // 另起一段
	cell = table.Cell(1, 1);
	cell.Select(); //选中该单元
	CString strPicture1 = strAppPath + _T("\\Result\\潘春春.jpg");
	CnlineShapes nLineShapes1 = wordSelection.get_InlineShapes();
	CnlineShape nLineshape1 = nLineShapes1.AddPicture(strPicture1, covFalse, covTrue, covOptional);
	nLineshape1.put_Height(478);
	nLineshape1.put_Width(550);

	//wordApp.put_Visible(TRUE);// Word程序可见,显示报告

	// 保存word文档
	CString strSavePath = strAppPath;
	strSavePath += _T("\\Word.docx");
	docx.SaveAs(COleVariant(strSavePath), covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);

	// 退出word应用
	docx.Close(covFalse, covOptional, covOptional);
	wordApp.Quit(covOptional, covOptional, covOptional);
	wordApp.ReleaseDispatch();

	MessageBox(_T("生成成功!"));
}

本文对应的资源已上传至https://download.csdn.net/download/fei_12138/13033821

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值