一种通过模板输出Docx的方法

起因

在2个群里都有网友讨论这个问题,俺就写了一个最简单的例子。其实,我们经常遇到一些Docx的输出的需求,“用模板文件进行处理”是最简单的一个方法,如果想预览也简单 DevExpress 、Teleric 都可以,而且也支持 Web 、Winform。啥平台的 移动动也没有关系,也无需环境。

模板

 下面是模板文件,需要替换的内容是红色部分

处理后的Docx

分析

这个例子中有3种处理方式:

  • 普通的文本替换
  • 文本替换为内容控件
  • 选择框的处理

主角  documentServer  先 LoadDocument

RichEditDocumentServer documentServer = new RichEditDocumentServer();

documentServer.LoadDocument("反馈表.docx", DevExpress.XtraRichEdit.DocumentFormat.OpenXml);

普通的文本替换

这种最简单,我为了演示 ,特意加了字体的处理,因为不加字体处理,代码就一行了。Document.Replace(range, txt2) 

调用:

            replace_txt(documentServer, "[培训的主办单位]", "微软MVP");
replace_txt(documentServer, "[培训讲师]", "月巴月巴白勺合鸟月半");

处理:

        private void replace_txt(RichEditDocumentServer documentServer ,string txt1 ,string txt2)
{
DocumentRange[] ranges = documentServer.Document.FindAll(txt1, SearchOptions.None);            
for (int i = ranges.Length - 1; i >= 0; i--)
{
DocumentRange range = ranges[i];
documentServer.Document.Replace(range, txt2);
CharacterProperties cp = documentServer.Document.BeginUpdateCharacters(range);
{
cp.Bold = true;
cp.FontName = "SimHei"; // 黑体
cp.ForeColor = Color.Red;
}
documentServer.Document.EndUpdateCharacters(cp);
}
}

文本替换为内容控件

这里我用了一个下拉框进行演示(彩蛋 :你还记得下拉框中的那句话吗?)

调用:

 replace_txt_drop(documentServer, "[受训人员]", "张三",new string[] { "张三", "李四", "传说结束了","历史才刚刚开始" });

处理:

        private void replace_txt_drop(RichEditDocumentServer documentServer, string txt1, string txt2, string[] items)
{
DocumentRange[] ranges = documentServer.Document.FindAll(txt1, SearchOptions.None);
for (int i = ranges.Length - 1; i >= 0; i--)
{
DocumentRange range = ranges[i];
documentServer.Document.Delete(range);
ContentControlComboBox dropdown = documentServer.Document.ContentControls.InsertComboBoxControl(range.Start);                
foreach (string s in items)
{
dropdown.AddItem(s, s);

dropdown.SetText(txt2);
}
}

选择框的处理

其实这就是个文本替换,和前面一样,唯一的不同就是用了书签。

调用:

 replace_bookmark(documentServer, "check3");

处理:

        private void replace_bookmark(RichEditDocumentServer documentServer, string bookmarkName)
{
BookmarkCollection Bookmarks = documentServer.Document.Bookmarks; 
if (Bookmarks[bookmarkName]!=null)
{
// 获取书签
Bookmark bookmark = Bookmarks[bookmarkName];
DocumentRange range = bookmark.Range;
// 替换书签内容
documentServer.Document.Replace(bookmark.Range, "R");
CharacterProperties cp = documentServer.Document.BeginUpdateCharacters(range);

cp.FontName = "Wingdings 2";  
}
documentServer.Document.EndUpdateCharacters(cp);
}
}

代码

       private void porc_replace(string filepath1 ,string filepath2){RichEditDocumentServer documentServer = new RichEditDocumentServer();documentServer.Options.FormattingMarkVisibility.ParagraphMark = DevExpress.XtraRichEdit.RichEditFormattingMarkVisibility.Visible;documentServer.Options.FormattingMarkVisibility.HiddenText = DevExpress.XtraRichEdit.RichEditFormattingMarkVisibility.Visible;documentServer.LoadDocument(filepath1, DevExpress.XtraRichEdit.DocumentFormat.OpenXml);documentServer.Options.FormattingMarkVisibility.ParagraphMark = DevExpress.XtraRichEdit.RichEditFormattingMarkVisibility.Visible;documentServer.Options.FormattingMarkVisibility.HiddenText = DevExpress.XtraRichEdit.RichEditFormattingMarkVisibility.Visible;replace_txt(documentServer, "[培训的主办单位]", "微软MVP");replace_txt(documentServer, "[培训讲师]", "月巴月巴白勺合鸟月半");replace_txt_drop(documentServer, "[受训人员]", "张三",new string[] { "张三", "李四", "传说结束了","历史才刚刚开始" });replace_bookmark(documentServer, "check3");documentServer.SaveDocument(filepath2, DevExpress.XtraRichEdit.DocumentFormat.OpenXml); documentServer.Dispose();}private void replace_bookmark(RichEditDocumentServer documentServer, string bookmarkName){BookmarkCollection Bookmarks = documentServer.Document.Bookmarks; if (Bookmarks[bookmarkName]!=null){// 获取书签Bookmark bookmark = Bookmarks[bookmarkName];DocumentRange range = bookmark.Range;// 替换书签内容documentServer.Document.Replace(bookmark.Range, "R");CharacterProperties cp = documentServer.Document.BeginUpdateCharacters(range);{ cp.FontName = "Wingdings 2";  }documentServer.Document.EndUpdateCharacters(cp);}}private void replace_txt_drop(RichEditDocumentServer documentServer, string txt1, string txt2, string[] items){DocumentRange[] ranges = documentServer.Document.FindAll(txt1, SearchOptions.None);for (int i = ranges.Length - 1; i >= 0; i--){DocumentRange range = ranges[i];documentServer.Document.Delete(range);ContentControlComboBox dropdown = documentServer.Document.ContentControls.InsertComboBoxControl(range.Start);                foreach (string s in items){dropdown.AddItem(s, s);} dropdown.SetText(txt2);}}private void replace_txt(RichEditDocumentServer documentServer ,string txt1 ,string txt2){DocumentRange[] ranges = documentServer.Document.FindAll(txt1, SearchOptions.None);            for (int i = ranges.Length - 1; i >= 0; i--){DocumentRange range = ranges[i];documentServer.Document.Replace(range, txt2);CharacterProperties cp = documentServer.Document.BeginUpdateCharacters(range);{cp.Bold = true;cp.FontName = "SimHei"; // 黑体cp.ForeColor = Color.Red;}documentServer.Document.EndUpdateCharacters(cp);}}private void button1_Click(object sender, EventArgs e){porc_replace("反馈表.docx", "反馈表替换后.docx");}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索 List 的奥秘:自己动手写一个 STL List✨

📖引言大家好!今天我们要一起来揭开 C 中 list 容器的神秘面纱——不是直接用 STL,而是亲手实现一个简化版的 list!🎉你是不是曾经好奇过:list 是怎么做到高效插入和删除的?🔍迭代器…

mysql占用高内存排查与解决

mysql占用高内存排查-- 查看当前全局内存使用情况(需要启用 performance_schema) SELECT * FROM sys.memory_global_total; -- 查看总内存使用 SELECT * FROM sys.memory_global_by_current_bytes LIMIT 10; -- 按模块分类查看内存使用排行memory/perfor…

构建真正自动化知识工作的AI代理

引言:新一代生产力范式的黎明 自动化知识工作的人工智能代理(AI Agent),或称“智能体”,正迅速从理论构想演变为重塑各行各业生产力的核心引擎。这些AI代理被定义为能够感知环境、进行自主决策、动态规划、调用工具并持…

青少年机器人技术(四级)等级考试试卷-实操题(2021年12月)

更多内容和历年真题请查看网站:【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 四级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年机器人技术(四级)等级考试试卷-实操题(2021年12月) …

最新短网址源码,防封。支持直连、跳转。 会员无广

最新短网址源码,防封。支持直连、跳转。 会员无广告1.可将长网址自动缩短为短网址,方便记忆和使用。2.短网址默认为临时有效,可付费升级为永久有效,接入支付后可自动完成,无需人工操作。3.系统支持设置图片/文字/跳转页…

缓存-变更事件捕捉、更新策略、本地缓存和热key问题

缓存-基础知识 熟悉计算机基础的同学们都知道,服务的存储大多是多层级的,呈现金字塔类型。通常来说本机存储比通过网络通信的外部存储更快(现在也不一定了,因为网络传输速度很快,至少可以比一些过时的本地存储设备速度…

报表工具DevExpress .NET Reports v25.1新版本亮点:AI驱动的扩展

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reporting控件日前正式发布了v25.1…

kubernetes中pod的管理及优化

目录 2 资源管理方式 2.1 命令式对象管理 2.2 资源类型 2.2.1 常用的资源类型 2.2.2 kubectl常见命令操作 2.3 基本命令示例 2.4 运行和调试命令示例 2.5 高级命令示例 3 pod简介 3.1 创建自主式pod(生产环境不推荐) 3.1.1 优缺点 3.1.2 创建…

解释一下,Linux,shell,Vmware,Ubuntu,以及Linux命令和shell命令的区别

Linux 操作系统概述Linux 是一种开源的类 Unix 操作系统内核,由 Linus Torvalds 于 1991 年首次发布。作为现代计算的基础设施之一,它具有以下核心特征:多用户多任务特性允许多个用户同时操作系统资源,而模块化设计使其能够适应从…

Windows 系统中,添加打印机主要有以下几种方式

在 Windows 系统中,添加打印机主要有以下几种方式,我将从最简单到最复杂为您详细介绍。 方法一:自动安装(推荐首选) 这是 Windows 10 和 Windows 11 中最简单、最现代的方法。系统会自动搜索网络(包括无线和有线网络)上可用的打印机并安装驱动程序。 操作步骤: 进入…

Mixture of Experts Guided by Gaussian Splatters Matters

Mixture of Experts Guided by Gaussian Splatters Matters: A new Approach to Weakly-Supervised Video Anomaly Detection ICCV2025 https://arxiv.org/pdf/2508.06318 https://github.com/snehashismajhi/GS-MoEAbstract 视频异常检测(VAD)是一项具有…

SeaTunnel Databend Sink Connector CDC 功能实现详解

Databend 是一个面向分析型工作负载优化的 OLAP 数据库,采用列式存储架构。在处理 CDC(Change Data Capture,变更数据捕获)场景时,如果直接执行单条的 UPDATE 和 DELETE 操作,会严重影响性能,无…

算法230. 二叉搜索树中第 K 小的元素

题目:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。示例 1:输入:root [3,1,4,null,2], k 1 输出:1 示例 2&#xff1…

Seaborn数据可视化实战:Seaborn多变量图表绘制高级教程

Seaborn多变量图表实战:从数据到洞察 学习目标 本课程将带领学员深入了解Seaborn库中用于绘制多变量图表的高级功能,包括联合图(Joint Plot)、对角线图(Pair Plot)等。通过本课程的学习,学员将能…

【数智化人物展】首衡科技CTO李蒙:算法会过时,数据会贬值,只有系统智能才具未来性

李蒙本文由首衡科技CTO李蒙投递并参与由数智猿数据猿上海大数据联盟共同推出的《2025中国数智化转型升级先锋人物》榜单/奖项评选。大数据产业创新服务媒体——聚焦数据 改变商业“算法会过时,数据会贬值。”当我第一次在内部战略会上抛出这句话时,现场…

word——将其中一页变成横向

在word中如何将其中一页变成横向? 在需要横向的这一页和上一页插入分节符(连续) 1.点击布局→分隔符→分节符(连续) 2.在所需要横向页将纸张方向改为横向即可。

使用WORD实现论文格式的样式化制作【标题样式、自动序列、页号(分节)、自动目录(修改字体类型)】

背景 每家院校对论文的格式都有一系列的特定要求,相应的会有一份格式标准的说明文档,该说明文档中会罗列对文档各个项的格式标准要求(例如:题目、1级标题、2级标题、页号、每个级别的字体字号,行距,段前段…

分享一个免费开源的网站跟踪分析工具Open-Web-Analytics(和GoogleAnalytics一样)

做独立网站的福音,这个是免费开源的,可增改性强。 开源地址:https://github.com/Open-Web-Analytics/Open-Web-Analytics 下载源码包 接着下载PHP工具:我用XP小皮 phpstudy_pro 地址:phpStudy - Windows 一键部署 …

Maxscript如何清理3dMax场景?

在3ds Max的创作过程中,随着项目的推进,场景往往会积累许多冗余元素,如孤立帮助对象、隐藏对象以及空层等,它们不仅让场景显得杂乱无章,还会占用资源、降低视口性能,影响工作效率。别担心,在本教程中,我们将为大家带来实用妙招——通过简单的Maxscript脚本片段,快速清…

JavaScript 性能优化实战:从分析到落地的全指南

一、引言:为什么 JS 性能优化至关重要?用户体验的直接影响:加载慢、交互卡顿如何流失用户(引用 Google 研究:页面加载延迟 1 秒,转化率下降 7%)业务价值关联:性能优化对 SEO、留存率…