一种通过模板输出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");}