当前位置: 首页 > news >正文

一种通过模板输出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.xdnf.cn/news/1355689.html

相关文章:

  • LeakyReLU和ReLU的区别
  • 探索 JUC:Java 并发编程的神奇世界
  • KVM虚拟化:提升企业效率的利器
  • 【嵌入式】【搜集】RTOS相关技术信息整理
  • 微信小程序界面常用操作
  • SpringBoot自动装配原理深度解析
  • 电蚊拍的原理及电压电容参数深度解析:从高频振荡到倍压整流的完整技术剖析
  • Trae Solo模式生成一个旅行足迹App
  • 最新短网址源码,防封。支持直连、跳转。 会员无广
  • Azure Kubernetes Service (AKS)
  • 视觉革命:云渲染如何让创意不再受限于硬件
  • qt ElaWidgetTools第一个实例
  • leetcode刷题记录03——top100题里的6道简单+1道中等题
  • H264编解码过程简述
  • 算法 ---哈希表
  • C 语言标准输入输出头文件stdio.h及其常见用法
  • 【KO】前端面试六
  • 【40页PPT】企业如何做好大数据项目的选型(附下载方式)
  • 利用背景图片定位套打档案封面
  • 当AI成了“历史笔迹翻译官”:Manus AI如何破解多语言手写文献的“密码锁”
  • 1200 SCL学习笔记
  • 【Java SE】抽象类与Object类
  • 51单片机-实现外部中断模块教程
  • SpringBoot3整合dubbo3客户端【最佳实践】
  • 编程刷题-染色题DFS
  • 【C标准库】详解<stdio.h>标准输入输出库
  • CUDA和torch的安装
  • 什么是多元线性回归,系数、自变量、因变量是什么,多元线性回归中的线性是什么
  • 多光谱相机检测石油石化行业的跑冒滴漏的可行性分析
  • 【yocto】Yocto Project 配置层(.conf)文件语法详解