C# 操作 Word 全域查找且替换(含图片对象)
目录
关于全域查找且替换
Word应用样本
SqlServer数据表部分设计样本
范例运行环境
配置Office DCOM
设计实现
组件库引入
实现原理
查找且替换的核心代码
窗格内容
页眉内容
页脚内容
形状内容
小结
关于全域查找且替换
C#全域操作 Word 查找且替换主要包括如下四个对象:
序号 | 对象 | 说明 |
1 | Word.Appication.Selection | 窗格对象 |
2 | Word.Section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range | 页眉对象 |
3 | Word.Section.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range | 页脚对象 |
4 | Word.Shape.TextFrame.TextRange | 形状对象 |
我们需要创建 Word.Find 对象,对上述相关区域分别进行查找替换操作。
Word应用样本
我们假设设计简历模板的输出,并查找且替换对应的关键字,如下图:
其中对应项目的关键字如 {xm}、{xb} 等则为查找且替换的对象,{grzp} 关键字处我们要处理图片的插入。
SqlServer数据表部分设计样本
设计 PersonInfo 数据表如下:
创建脚本如下:
CREATE TABLE [dbo].[PersonInfo]( [id] [uniqueidentifier] ROWGUIDCOL NOT NULL, [sfzh] [varchar](18) NOT NULL, [xm] [nvarchar](50) NOT NULL, [xb] [nvarchar](1) NULL, [grzp] [image] NULL, CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [IX_PersonInfo] UNIQUE NONCLUSTERED ( [sfzh] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[PersonInfo] ADD CONSTRAINT [DF_PersonInfo_id] DEFAULT (newid()) FOR [id] GO
通过查询 select sfzh,xm,xb,grzp from PersonInfo where id=xxx 得到DataSet,再取 Tables[0]中的数据。
范例运行环境
操作系统: Windows Server 2019 DataCenter
操作系统上安装 Office Excel 2016
数据库:Microsoft SQL Server 2016
.net版本: .netFramework4.7.1 或以上
开发工具:VS2019 C#
配置Office DCOM
配置方法可参照我的文章《C# 读取Word表格到DataSet》进行处理和配置。
设计实现
组件库引入
实现原理
我们假设查询出表数据,存入对应的变量,其中将二进制字段grzp数据写入到d:\test.jpg生成图片,示例代码如下:
DataTable dt=DataSet.Tables[0]; string sfzh = dt.Rows[0]["sfzh"].ToString(); object bt = dt.Rows[0]["grzp"]; byte[] bFile2 = (byte[])bt; System.IO.File.WriteAllBytes("@d:\test.jpg", bFile2); string xm = dt.Rows[0]["xm"].ToString(); string xb = dt.Rows[0]["xb"].ToString();
然后我们将其存到二维字符串数组 _repls 里,如下代码:
string[,] _repls = new string[4, 2]; _repls[0, 0] = "{sfzh}"; _repls[0, 1] = sfzh; _repls[1, 0] = "{xm}"; _repls[1, 1] = xm; _repls[2, 0] = "{xb}"; _repls[2, 1] = xb; _repls[3, 0] = "RepalceFromImageFilename_{grzp}"; _repls[3, 1] = "@d:\test.jpg";
其中第一元素存储要查找的关键字,第二元素存储要替换的值。注意:替换图片使用了自定义的RepalceFromImageFilename_ 前缀关键字,则表示值为对应的文件路径。数据准备完毕后,我们将通过遍历数组对 Word 进行查找且替换操作。
查找且替换的核心代码
窗格内容
示例代码如下:
WordApp.Options.ReplaceSelection = true; Word.Find fnd = WordApp.Selection.Find; for(int i=0;i