C# 操作 Word 全域查找且替换(含图片对象)

2024-03-29 20:20

本文主要是介绍C# 操作 Word 全域查找且替换(含图片对象),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

关于全域查找且替换

Word应用样本

SqlServer数据表部分设计样本

范例运行环境

配置Office DCOM

设计实现

组件库引入

实现原理

查找且替换的核心代码

窗格内容

页眉内容

页脚内容

形状内容

小结


关于全域查找且替换

C#全域操作 Word 查找且替换主要包括如下四个对象:

序号对象说明
1Word.Appication.Selection窗格对象
2Word.Section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range页眉对象
3Word.Section.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range页脚对象
4Word.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]
GOALTER 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<_repls.GetLength(0);i++){if (_repls[i, 0] == "" || _repls[i, 0] == null){continue;}fnd.ClearFormatting();string ft = _repls[i, 0];string replaceType = "";if (ft.IndexOf("RepalceFromImageFilename_") == 0){ft = ft.Replace("RepalceFromImageFilename_", "");replaceType = "RepalceFromImageFilename";}else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0){ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");replaceType = "RepalceFromImageFilenameNoDelete";}Object findText = ft;Object matchCase = false;Object matchWholeWord = Type.Missing;Object matchWildcards = false;Object matchSoundsLike = false;Object matchAllWordForms = false;Object forward = true;Object wrap =Word.WdFindWrap.wdFindContinue;Object format = false;Object replaceWith ="";Object replace =Type.Missing;;Object matchKashida = Type.Missing;Object matchDiacritics = Type.Missing;Object matchAlefHamza = Type.Missing;Object matchControl = Type.Missing;while(fnd.Execute(ref findText, ref matchCase, ref matchWholeWord,ref matchWildcards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceWith,ref replace, ref matchKashida, ref matchDiacritics,ref matchAlefHamza, ref matchControl)){string r_f=WordApp.Selection.Font.Name.ToString();if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete"){if (File.Exists(_repls[i, 1].ToString())){WordApp.Selection.Range.Select();Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, WordApp.Selection.Range);if (replConfigs != null){string[] cv = replConfigs[ft].Split('|');pic.Width = int.Parse(cv[0]);pic.Height = int.Parse(cv[1]);}if (replaceType == "RepalceFromImageFilename"){File.Delete(_repls[i, 1].ToString());}}}else{WordApp.Selection.Range.Text = _repls[i, 1].ToString();}}}
页眉内容

示例代码如下:

                foreach (Word.Section header in WordDoc.Sections){Word.Range headerRange = header.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;Word.Find fnd = headerRange.Find;for (int i = 0; i < _repls.GetLength(0); i++){if (_repls[i, 0] == "" || _repls[i, 0] == null){continue;}fnd.ClearFormatting();string ft = _repls[i, 0];string replaceType = "";if (ft.IndexOf("RepalceFromImageFilename_") == 0){ft = ft.Replace("RepalceFromImageFilename_", "");replaceType = "RepalceFromImageFilename";}else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0){ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");replaceType = "RepalceFromImageFilenameNoDelete";}Object findText = ft;Object matchCase = false;Object matchWholeWord = Type.Missing;Object matchWildcards = false;Object matchSoundsLike = false;Object matchAllWordForms = false;Object forward = true;Object wrap = Word.WdFindWrap.wdFindContinue;Object format = false;Object replaceWith = "";Object replace = Type.Missing; ;Object matchKashida = Type.Missing;Object matchDiacritics = Type.Missing;Object matchAlefHamza = Type.Missing;Object matchControl = Type.Missing;while (fnd.Execute(ref findText, ref matchCase, ref matchWholeWord, ref matchWildcards, ref matchSoundsLike, ref matchAllWordForms,ref forward, ref wrap, ref format, ref replaceWith, ref replace, ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl)){string r_f = WordApp.Selection.Font.Name.ToString();if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete"){if (File.Exists(_repls[i, 1].ToString())){WordApp.Selection.Range.Select();Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, headerRange);if (replaceType == "RepalceFromImageFilename"){File.Delete(_repls[i, 1].ToString());}}}else{headerRange.Text = _repls[i, 1].ToString();}}}}
页脚内容

示例代码如下:

                foreach (Word.Section footer in WordDoc.Sections){Word.Range footerRange = footer.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;Word.Find fnd = footerRange.Find;for (int i = 0; i < _repls.GetLength(0); i++){if (_repls[i, 0] == "" || _repls[i, 0] == null){continue;}fnd.ClearFormatting();string ft = _repls[i, 0];string replaceType = "";if (ft.IndexOf("RepalceFromImageFilename_") == 0){ft = ft.Replace("RepalceFromImageFilename_", "");replaceType = "RepalceFromImageFilename";}else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0){ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");replaceType = "RepalceFromImageFilenameNoDelete";}Object findText = ft;Object matchCase = false;Object matchWholeWord = Type.Missing;Object matchWildcards = false;Object matchSoundsLike = false;Object matchAllWordForms = false;Object forward = true;Object wrap = Word.WdFindWrap.wdFindContinue;Object format = false;Object replaceWith = "";Object replace = Type.Missing; ;Object matchKashida = Type.Missing;Object matchDiacritics = Type.Missing;Object matchAlefHamza = Type.Missing;Object matchControl = Type.Missing;while (fnd.Execute(ref findText, ref matchCase, ref matchWholeWord, ref matchWildcards, ref matchSoundsLike, ref matchAllWordForms,ref forward, ref wrap, ref format, ref replaceWith, ref replace, ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl)){string r_f = WordApp.Selection.Font.Name.ToString();//						WordApp.Selection.Font.Name=r_f;//						WordApp.Selection.Range//						WordApp.Selection.TypeText(_repls[i,1].ToString());if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete"){if (File.Exists(_repls[i, 1].ToString())){WordApp.Selection.Range.Select();Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, footerRange);if (replaceType == "RepalceFromImageFilename"){File.Delete(_repls[i, 1].ToString());}}}else{footerRange.Text = _repls[i, 1].ToString();}}}}
形状内容

示例代码如下:

                foreach (Word.Shape shape in WordDoc.Shapes){if (shape.TextFrame.HasText == 0){continue; }Word.Find fnd = shape.TextFrame.TextRange.Find;//Word.Find fnd = WordDoc.Content.Find;for (int i = 0; i < _repls.GetLength(0); i++){if (_repls[i, 0] == "" || _repls[i, 0] == null){continue;}fnd.ClearFormatting();string ft = _repls[i, 0];string replaceType = "";if (ft.IndexOf("RepalceFromImageFilename_") == 0){ft = ft.Replace("RepalceFromImageFilename_", "");replaceType = "RepalceFromImageFilename";}else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0){ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");replaceType = "RepalceFromImageFilenameNoDelete";}Object findText = ft;Object matchCase = false;Object matchWholeWord = Type.Missing;Object matchWildcards = false;Object matchSoundsLike = false;Object matchAllWordForms = false;Object forward = true;Object wrap = Word.WdFindWrap.wdFindContinue;Object format = false;Object replaceWith = "";Object replace = Type.Missing; ;Object matchKashida = Type.Missing;Object matchDiacritics = Type.Missing;Object matchAlefHamza = Type.Missing;Object matchControl = Type.Missing;while (fnd.Execute(ref findText, ref matchCase, ref matchWholeWord, ref matchWildcards, ref matchSoundsLike, ref matchAllWordForms,ref forward, ref wrap, ref format, ref replaceWith, ref replace, ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl)){string r_f = WordApp.Selection.Font.Name.ToString();if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete"){if (File.Exists(_repls[i, 1].ToString())){Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, shape.TextFrame.TextRange);if (replaceType == "RepalceFromImageFilename"){File.Delete(_repls[i, 1].ToString());}}}else{shape.TextFrame.TextRange.Text = _repls[i, 1].ToString();}}}}

小结

1、示例代码是冗余的写法,在实际应用中我们需要进行优化。

2、添加图片后,代码默认是使用完毕后,删除图片文件以释放空间,我们自定义了 RepalceFromImageFilenameNoDelete_ 前缀关键字,表示使用完毕后不进行文件删除。

3、示例代码中 Word 表示 using Word=Microsoft.Office.Interop.Word; 的引用。

4、示例代码 WordDoc 表示对 Word.Document 的引用。

示例代码我们提供了操作的关键方法,这里仅作参考,其它代码不再做展示,欢迎大家评论指教!

这篇关于C# 操作 Word 全域查找且替换(含图片对象)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859545

相关文章

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格