使用 OpenXml 產生 Word 檔案
OpenXml 是微軟開發的一套以XML為基礎的函式庫,用來存取 Office 檔案,支援 .Net Core 平台。在這裡我們要用 OpenXml 來產生一個 Word 檔案,在步驟上先建立一個 Word 檔案做為範本,然後讀取資料庫,把欄位內容填入這個範本的指定位置。這樣的主題在網路上有很多討論和範例,在這裡我們的注意力放在模組化上面,希望盡量精簡客製化的程式碼,來降低系統開發的成本。
以人事管理系統裡面的 [用戶經歷維護] 為例,當你點選 清單畫面上的 [產生Word文件] 的時候,系統即會產生這個用戶的履歷檔案,如以下畫面,它包含3種不同種類的內容:(1)單筆資料、(2)多筆資料、(3)圖片
Word範本製作
用戶履歷的範本位於 HrAdm/_template/UserExt.docx,它的檔案內容如下圖,在設計時必須在指定的位置填入所要顯示的欄位名稱,即可顯示所需要的資料:
這3種資料的填寫方式如下
(1)單筆資料:欄位名稱前後加上中括號, 例如:[Name]
(2)多筆資料:與單筆資料的做法相同,另外,在每一行後面加下 [!X],X表示第幾個資料群組,例如工作經驗為0, 學歷資料為1
(3)圖片:放一張任意圖片,同時在它的 [替代文字] 輸入一個指定的代碼,如下圖,系統會把這個代碼對應的圖檔放到這個位置。
實作
在這裡我們把 Word 套表的公用程式包裝在 BaseWeb/Service/_WebWord.cs 的 TplRowToScreen 函數:
public static void TplRowToScreen(string tplPath, string fileName, dynamic row,
List<IEnumerable<dynamic>> childs = null, List <WordImageDto> images = null)
{
它有5個輸入參數:
• tplPath:Word 範本的檔案路徑
• fileName:要產生的檔案名稱
• row:要套用的單筆資料
• childs:要套用的多個多筆資料
• images:多個圖檔的內容,包含代碼、圖檔路徑
以下程式碼是產生用戶履歷檔案時,叫用 TplRowToScreen 函數時的傳入參數內容,它位在 HrAdm/Services/UserExtService.cs 第 80 行左右
其中每個編號的程式內容說明如下:
(1)使用 Lambda 語法,讀取用戶的多筆專業技能資料
(2)總共有5組多筆資料,順序必須配合範本檔案的設定
(3)圖檔的設定資料,Code會對應到 [替代文字] 的輸入內容,FilePath 在這裡會等於用戶上傳的照片檔案
(4)呼叫 _WebWord.TplRowToScreen() 並傳入參數
除此之外,這裡有另外一個套表的範例,從資料庫文件系統的 [專案維護] 功能,執行某個專案的 [產生Word文件],系統會產這個專案的資料庫文件,它包含多個資料表的內容,在程式的邏輯上與用戶經歷略有不同,如果有興趣也可以參考,產生的 Word 檔案部分內容如下圖: