WPF應用程式生成Word文件測試
阿新 • • 發佈:2018-12-14
莫名其妙地有了這個需求,於是進行了一下實戰。本文使用天氣預報api自動生成Word格式的報表,使用VSTO相關技術,在VS2017+Word2016中測試通過,結果如圖:
Word模板製作
圖中大標題及文末日期為兩個格式文字內容控制元件(RichTextContentControl),而後用{1}表示即將新增正文的部分。如圖所示:為了方便之後新增文字,將標題控制元件的標記(Tag)命名為TitleRTFControl,日期控制元件的標記(Tag)命名為DateRTFControl,將模板儲存為Test.dotx。
在VS2017中新建WPF應用程式,新增對Microsoft.Office.Interop.Word和Microsoft.Office.Tools.Word的引用。並在MainWindow中新增按鈕。
為方便起見,
using Word = Microsoft.Office.Interop.Word;
using Tools = Microsoft.Office.Tools.Word;
使用模板新建文件
Word.Application application = new Word.Application();//新建Word應用程式 application.Visible = true;//顯示Word視窗,刪除此句Word以後臺方式執行 var document = application.Documents.Add(System.Environment.CurrentDirectory+"\\Test.dotx");//以模板新建文件
使用Tag尋找內容控制元件,獲得其例項的引用,並修改其內容。注意,Word中陣列的index多從1開始,而不是0
#region 尋找內容控制元件 Word.ContentControl TitleRTFControl = document.SelectContentControlsByTag("TitleRTFControl")[1]; Word.ContentControl DateRTFControl = document.SelectContentControlsByTag("DateRTFControl")[1]; #endregion #region 修改內容控制元件內容 TitleRTFControl.Range.Text = "全國主要城市天氣預報"; DateRTFControl.Range.Text = DateTime.Now.ToString("yyyy年MM月dd日"); #endregion
之後尋找文件中的佔位符{1},全選文件,在選定範圍內查詢並選中。因Document.Range需傳送兩個object物件,故使用start和end對int進行封裝。
#region 查詢文件中的文字並選中
object FindText = "{1}";
object start = document.Content.Start;
object end = document.Content.End;
Word.Range range = document.Range(start, end);
range.Find.ClearFormatting();
if (range.Find.Execute(ref FindText))
{
range.Select();
}
#endregion
替換文字,之前已從api中獲取天氣資料並存儲在一個StringBuilder物件中。
#region 插入文字
Word.Selection currentSelection = application.Selection;
application.Options.Overtype = false;
currentSelection.TypeText(stringBuilder.ToString());
currentSelection.TypeParagraph();
#endregion
點選執行,效果良好。