起因
在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");}