导出word之插入图片

最近做了个项目,要根据数据库内容生成word,内容包括表格,图片,段落等等。其中图片碰到如下的问题:

如何使图片按照生成内容的顺序输出?

上网查相关资料,一般都是设置

var s = word.Application.Selection.InlineShapes.AddPicture(strPicPath, Nothing, Nothing, Nothing);
ss.WrapFormat.Type = WdWrapType.wdWrapSquare;

那么这个wdWrapSquare代表的是什么呢?

查看下word的版式,包括如下内容:

然后,word中包含如下样式:

其中wdWrapBehind是指衬于文字下方。

wdWrapFront是浮于文字上方

wdWrapSquare是四周环绕型

wdWrapTight是紧密型环绕

等等。。。

但是把这里所有的版式都试了一个便,还是没有我想要的:嵌入型!

后来注释此句“ss.WrapFormat.Type = WdWrapType.wdWrapSquare”,发现图片能够正确导出了!

原来word中导出时默认的就是嵌入型!好吧。。。众里寻他千百度,那人却在灯火阑珊处~

 

转载于:https://www.cnblogs.com/codestore/p/4021789.html

### 如何通过 MFC 实现导出 Word 文档并在其中插入图片 #### 功能概述 MFC 提供了一种方法来操作 Microsoft Word 或其他类似的办公软件(如 WPS),从而可以生成带有文字和图片的文档。以下是具体实现方式。 --- #### 开发环境配置 为了能够成功调用 Word 的 COM 接口,需要完成以下步骤: 1. **加载类型库** 使用 Visual Studio 中的 Class Wizard 工具,添加来自 `MSWORD.OLB` 文件的支持类[^2]。此文件通常位于 Office 软件安装目录下。 2. **引入必要的 DLL 文件** 如果使用的是 WPS,则需定位到其安装路径下的 `wpsapi.dll` 并将其引入项目中[^4]。需要注意的是,仅导入所需的接口即可,避免因过多接口导致编译错误。 3. **设置自动化支持** 在应用程序初始化阶段启用 OLE 自动化功能。这可以通过重载 `InitInstance()` 函数并调用 `_AfxOleInit();` 来完成。 --- #### 主要代码实现 ##### 初始化 Word 应用程序对象 ```cpp // 声明变量 CComPtr<Word::Application> spApp; CComPtr<Word::Documents> spDocs; CComPtr<Word::Document> spDoc; // 启动 Word 应用程序 spApp.CoCreateInstance("Word.Application"); if (!spApp) { AfxMessageBox(_T("无法启动 Word!")); return FALSE; } // 设置不可见模式运行 spApp->Visible = VARIANT_FALSE; // 打开指定模板文件 _variant_t vtFileName((LPCTSTR)"D:\\report.dot", VT_BSTR); spDocs = spApp->GetDocuments(); spDoc = spDocs->Open(vtFileName); if (!spDoc) { AfxMessageBox(_T("打开模板失败!")); return FALSE; } ``` 上述代码片段展示了如何创建 Word 应用实例以及加载预定义好的 `.dot` 模板文件。 --- ##### 插入文本内容 利用书签机制可以在特定位置写入数据。假设模板中有名为 `"BookmarkText"` 的占位符: ```cpp CComPtr<Word::_Range> spRange; CComVariant varName(L"BookmarkText"); // 获取范围对象 spRange = spDoc->Bookmarks->Item(varName)->GetRange(); // 替换为实际字符串 spRange->SetText(_bstr_t("这里是动态插入的文字内容")); // 更新书签状态 spDoc->Bookmarks->Add(varName, spRange); ``` 这里的关键在于获取目标区域并通过 `SetText` 方法赋新值。 --- ##### 插入图像资源 同样借助书签技术可嵌套外部图形素材至文档内部: ```cpp CString strImagePath = _T("D:\\temp1.jpg"); // 图像绝对地址 CComVariant varImage(strImagePath.AllocSysString()); // 定义另一处标记名称用于放置插图 varName = L"BookmarkImage"; spRange = spDoc->Bookmarks->Item(varName)->GetRange(); // 将本地存储的 JPG 加载进来 spRange->InlineShapes->AddPicture(varImage, false, true, spRange); ``` 以上过程说明了怎样依据既定标签名将一幅静态图片附加于对应段落之中。 --- ##### 保存与关闭处理 最后一步便是妥善保管编辑后的成果,并释放占用资源: ```cpp // 输出最终版本给用户查阅或者存盘备用 _variant_t fileNameOut(_T("D:\\GeneratedReport.docx"), VT_BSTR); spDoc->SaveAs(fileNameOut); // 清理工作完毕后退出进程 spDoc.Release(); spApp->Quit(); spApp.Release(); ``` 至此整个流程结束,一份含图文混排的新文档被顺利构建出来。 --- ### 注意事项 - 若遇到权限不足的情况,请确认当前账户具有足够的访问权利去读取所需资料及撰写结果文件。 - 需要注意不同版本间的兼容性问题;尤其是跨平台迁移时可能面临 API 行为差异的风险。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值