1. 程式人生 > >WPF應用程式生成Word文件測試

WPF應用程式生成Word文件測試

莫名其妙地有了這個需求,於是進行了一下實戰。本文使用天氣預報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

點選執行,效果良好。
在這裡插入圖片描述