跳到主要內容區塊

計資中心電子報C&INC E-paper

技術論壇

網頁伺服器端Word合併列印實作(.NET C#)
  • 卷期:v0067
  • 出版日期:2023-12-20

作者:張如媚 / 臺灣大學計算機及資訊網路中心程式設計組行政組員


系統開發,遇到使用者需求,要下載處理過的Word表單,除了介紹過的,以Word另存XML套表的方式,還有使用Word合併列印。之前有介紹過,於後端產生資料來源,下載至使用者電腦後,於使用者端執行JavaScript合併列印的方式;現在,要再來介紹,如何從伺服器端執行Word合併列印。

 

Word套表匯出方式

之前介紹過的,以Word將要匯出的表格範本,另存為XML格式,再以字串置換套表的方式來匯出Word檔。這最簡單,不需在Server額外安裝Word或其他元件,只需以文字讀取XML檔,並置換參數值即可,但每次使用者的表單改版,還是需要程式師費時將參數一一鍵入,並確保表格範本中的參數名稱在輸入時,沒被Word動過手腳;接著還有介紹過,從client端呼叫JavaScript來執行合併列印,這對Server負擔較小,只需傳輸文字資料,資料量不大,對使用者來說還算方便,缺點就是,實際操作者要安裝Word,並且瀏覽器對於安全性的設定,會影響到JavaScript是否可以正常執行,且因這方式只會產生一個Word檔,適合需要同時大批列印相同格式的紙本表單。

 

日前因使用者需求,要直接下載處理過的PDF檔,查找了許多可行方案,其中以Word合併列印,並儲存成PDF最為方便,網路上可以找到許多現有元件,大多皆為付費服務,若有興趣可以自行上網搜尋;尋找解決方案的過程中發現,直接呼叫Word應用程式,以合併列印的方式套表後匯出,這方法很簡單,所以這篇就來介紹,如何於伺服器端實作。

 

伺服器端Word合併列印

系統需求除了IIS外,就是必需安裝Microsoft Word,接著於電腦中找到所需元件,複製放到網站的bin目錄下:

C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Word\(已安裝版本)\Microsoft.Office.Interop.Word.dll

 

接著設定權限,請開啟「元件服務」>「電腦」>「DCOM設定」>選擇「Microsoft Word 97 – 2003文件」>右鍵「內容」修改以下設定:

頁籤「識別身分」>選擇「互動式使用者」

 

20231220_006708_01

圖1:「識別身分」設定

 

頁籤「安全性」>「啟動和啟用權限」> 選「自訂」並按「編輯」> 「群組或使用者名稱」新增「IIS_IUSRS」,並給予「本機啟動」及「本機啟用」權限。

 

20231220_006708_02

圖2:「安全性>啟動和啟用權限」設定

 

頁籤「安全性」>「存取權限」>選「自訂」並按「編輯」>「群組或使用者名稱」新增「IIS_IUSRS」,並給予「本機存取」權限。

 

20231220_006708_03

圖3:「安全性>存取權限」設定

 

完成環境設定後,接著準備需進行合併列印的表格與資料來源,資料來源可為excel、資料庫、純文字檔等,在此做了份簡單的示範用範本sample.doc,及資料來源sample.txt,若不了解如何操作Word合併列印,請自行搜尋網路教學,在此不多著墨。

 

 

20231220_006708_04

圖4:示範用表單格式sample.doc

 

20231220_006708_05

圖5:示範用資料來源sample.txt

 

完成準備工作,撰寫範例程式如圖6,內容主要是開啟範本sample.doc後,指定合併列印的資料來源sample.txt,接著執行合併列印,完成後再儲存合併後的表單,若要存成PDF,只需要修改指定儲存格式為WdSaveFormat.wdFormatPDF即可。

 

20231220_006708_06

圖6:示範用程式內容

 

20231220_006708_07

圖7:示範匯出之Word檔案內容

 

延伸應用

程式操作Word做合併列印非常簡單吧!若想要提供個人化的電子檔案,可以此為基礎,從資料庫中取得資料,建立文字檔資料來源,個別執行合併列印後,再轉存Word或PDF檔,也能再加上浮水印,只要修改合併列印檔案即可;要注意的是,範本僅需開啟一次,經不斷的合併及儲存後,所有合併作業完成,再關閉應用程式即可,這部份就請大家自行試試了。

 

參考來源:Microsoft.Office.Interop.Word Namespace (https://learn.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word?view=word-pia)