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]
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<_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 的引用。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/499057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GK7205V500国科微 GK7205RNCFV500 GOKE

GK7205V300 芯片是国科针对 IPC 市场推出的新一代支持 H.265 编码的低功耗 IPC SOC 芯片。 该芯片集成专用的 ISP&#xff0c;拥有高效的视频编码处理性能&#xff0c;支持 H.265 编码&#xff0c;满足客户各种差异化业务需求。集 成了 RTC、POR、Audio codec 以及丰富的外设…

大话设计模式之策略模式

策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。这种模式定义了一族算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互相替换。 在策略模式中&#xff0c;一个类的行为或其算法可以在运行时改变。这种模式包含以下角色&#xff1…

Elasticsearch:语义搜索即服务处于卓越搜索的中心

作者&#xff1a;来自 Elastic Sherry Ger, Stephen Brown 对于许多企业来说&#xff0c;搜索卓越中心&#xff08;center of excellence - COE&#xff09;向其用户提供搜索服务&#xff0c;从不同的数据源中整理知识&#xff0c;并将搜索功能集成到其内部和外部应用程序中。…

Tensorflow2.0笔记 - metrics做损失和准确度信息度量

本笔记主要记录metrics相关的内容&#xff0c;详细内容请参考代码注释&#xff0c;代码本身只使用了Accuracy和Mean。本节的代码基于上篇笔记FashionMnist的代码经过简单修改而来&#xff0c;上篇笔记链接如下&#xff1a; Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…

AI 异构计算机设计方案:902-基于6U VPX 高带宽PCIe的GPU AI 异构计算机

基于6U VPX 高带宽PCIe的GPU AI 异构计算机 一、产品概述 基于6U 6槽 VPX 高带宽PCIe的GPU AI 异构计算机以PCIe总线为架构&#xff0c;通过高带宽的PCIe互联&#xff0c;实现主控计算板、GPU AI板卡&#xff0c;FPGA接口板&#xff0c;存储板的PCIe高带宽互联访问&…

揭秘百度百科审核内幕,百科词条审核究竟需要多久?

百度百科作为国内最大的网络百科全书平台之一&#xff0c;致力于提供全面、准确的知识服务&#xff0c;同时也承担着审核百科词条的工作。在互联网时代&#xff0c;人们对信息的需求日益增长&#xff0c;因此百度百科的审核工作显得尤为重要。那么&#xff0c;百度百科词条审核…

152 Linux C++ 通讯架构实战7 ,makefile编写改成for cpp,读配置文件,内存泄漏查找,设置标题实战

读写配置文件代码实战。nginx.conf 一个项目要启动&#xff0c;需要配置很多信息&#xff0c;第一项就是学习如何配置一个项目 nginx.conf的内容 #是注释行&#xff0c; #每个有效配置项用 等号 处理&#xff0c;等号前不超过40个字符&#xff0c;等号后不超过400个字符&#…

虚幻引擎资源加密方案解析

前段时间&#xff0c;全球游戏开发者大会(Game Developers Conference&#xff0c;简称GDC)在旧金山圆满落幕&#xff0c;会议提供了多份值得参考的数据报告。根据 GDC 调研数据&#xff0c;当下游戏市场中&#xff0c;Unreal Engine (下文简称虚幻)和 Unity 是使用最多的游戏引…

Qlib-Server:量化库数据服务器

Qlib-Server:量化库数据服务器 介绍 Qlib-Server 是 Qlib 的配套服务器系统,它利用 Qlib 进行基本计算,并提供广泛的服务器系统和缓存机制。通过 Qlib-Server,可以以集中的方式管理 Qlib 提供的数据。 框架 Qlib 的客户端/服务器框架基于 WebSocket 构建,这是因为 WebS…

js动态设置页面高度

准备一个div <div class"card-edit"><!-- 业务需求 --> </div>开始操作 // 获取页面的中需要设置高度的元素 如&#xff1a;card-editconst autoStyle document.getElementsByClassName(card-edit)[0]// 根据业务需求做判断// 此处设定&#…

DC电源模块的设计与制造流程

BOSHIDA DC电源模块的设计与制造流程 DC电源模块是一种用于将交流电转换为直流电的设备。它广泛应用于各种电子设备中&#xff0c;如电子产品、工业仪器、电视等。下面是DC电源模块的设计与制造流程的简要描述&#xff1a; 1. 需求分析&#xff1a;在设计DC电源模块之前&#…

sql——对于行列转换相关的操作

目录 一、lead、lag 函数 二、wm_concat 函数 三、pivot 函数 四、判断函数 遇到需要进行行列转换的数据处理需求&#xff0c;以 oracle 自带的表作为例子复习一下&#xff1a; 一、lead、lag 函数 需要行列转换的表&#xff1a; select deptno,count(empno) emp_num from…

R语言赋值符号<-、=、->、<<-、->>的使用与区别

R语言的赋值符号有&#xff1c;-、、-&#xff1e;、&#xff1c;&#xff1c;-、-&#xff1e;&#xff1e;六种&#xff0c;它们的使用与区别如下: <-’&#xff1a;最常用的赋值符号。它将右侧表达式的值赋给左侧的变量&#xff0c;像一个向左的箭头。例如&#xff0c;x …

Python-VBA编程500例-024(入门级)

字符串写入的行数(Line Count For String Writing)在实际应用中有着广泛的应用场景。常见的应用场景有&#xff1a; 1、文本编辑及处理&#xff1a;在编写或编辑文本文件时&#xff0c;如使用文本编辑器或文本处理器&#xff0c;经常需要处理字符串并确定其在文件中的行数。这…

【数据结构 | 图论】如何用链式前向星存图(保姆级教程,详细图解+完整代码)

一、概述 链式前向星是一种用于存储图的数据结构&#xff0c;特别适合于存储稀疏图&#xff0c;它可以有效地存储图的边和节点信息&#xff0c;以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起&#xff0c;通过数组的方式连接&#xff08;类似静态数组实现链表…

基于Springboot+Vue的酒店管理系统!新鲜出炉,可商用,带源码

新年了给大家分享一套基于SpringbootVue的酒店管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文末自取) 一、系统运行图&#xff08;管理端和用户端&#xff09; 1、管理登陆 2、房间管理 3、订单管理 4、用户登陆 5、房间预定 二、系统搭建视频教…

JavaEE—— HTTP协议和与Tomcat (末篇)

本篇文章&#xff0c;承接前面两篇文章&#xff1a; 在前面的两篇文章中&#xff0c;简单介绍了 什么是 HTTP 协议&#xff0c;介绍了抓包工具&#xff0c;如何构造 HTTP 请求&#xff0c;以及&#xff0c;如何使用第三方工具来简化构造请求的过程。 如果需要了解前面的知识可…

算法---动态规划练习-6(地下城游戏)

地下城游戏 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;定义一个二维数组 dp&#xff0c;其中 dp[i][j] 表示从位置 (i, j) 开始到达终点时的最低健康点数。 初始化数组 dp 的边界条件&#xff1a; 对…

AI赋能微服务:Spring Boot与机器学习驱动的未来应用开发

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

实践笔记-harbor搭建(版本:2.9.0)

harbor搭建 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09;2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境&#xff1a;centos7 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09; 网盘资源&#xff1a;https://pan.baidu.com/s/1fcoJIa4x…