2017年7月1日 星期六

ASP.NET 使用TemplateEngine.Docx套件,Word套表產生docx檔

參考資料:
[C#]TemplateEngine.Docx Word產出好工具
GitHub-TemplateEngine.Docx

本篇使用TemplateEngine.Docx套件來達到Word套表,很適合用在固定的格式,當然作法首先要先作好1個Word檔,也就是要套表的格式,再透過程式將資料寫到自己設定好的Word檔中,產生Word docx檔。

作法如下,因為我自己有時候會把一些筆記寫在Word檔(方便還可以截圖),所以我就不把步驟重新寫一次,直接截圖貼圖上來。




Step 8.程式碼部分
Imports System
Imports System.IO
Imports TemplateEngine.Docx

Partial Class test_TemplateEngine
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'法1.套表完後,儲存在TempWord資料夾
        'step1. 設定路徑
        Dim str_temppath As String = String.Empty, str_NewFileName As String = String.Empty
'給套表後的檔案(新的檔案)一個檔名,這裡用 字串_帳號_時間來設定檔名
        str_NewFileName = "table_1060403_" & DateTime.Now.ToString("yyyyMMddHHmmss") & ".docx"
'設定套表完後的檔案暫存位置
        str_temppath = Server.MapPath("~/TempWord/") & str_NewFileName
'拷貝TemplateWord目錄底下的table2.docx檔案 到 TempWord目錄底下
        File.Copy(Server.MapPath("~/TemplateWord/table2.docx"), str_temppath)

        'step2. 設定要填入的資料 Content
        Dim valuesToFill As Content = Nothing
        valuesToFill = New Content()
        valuesToFill.Fields.Add(New FieldContent("YEAR", "106")) '指定YEAR填入的資料是106

        'step3. 儲存變更
        Using OD1 As TemplateProcessor = New TemplateProcessor(str_temppath).SetRemoveContentControls(True)
            OD1.FillContent(valuesToFill)
            OD1.SaveChanges()
        End Using

'============================================================
        ''法2.套表完後,並下載檔案
        ''step1. 設定路徑
        'Dim str_temppath As String = String.Empty, str_NewFileName As String = String.Empty
        ''給套表後的檔案(新的檔案)一個檔名,這裡用 字串_帳號_時間來設定檔名
        'str_NewFileName = "table_1060403_" & DateTime.Now.ToString("yyyyMMddHHmmss") & ".docx"
        ''設定套表完後的檔案暫存位置
        'str_temppath = Server.MapPath("~/TempWord/") & str_NewFileName
        ''拷貝TemplateWord目錄底下的table2.docx檔案 到 TempWord目錄底下
        'File.Copy(Server.MapPath("~/TemplateWord/table2.docx"), str_temppath)

        ''step2. 設定要填入的資料 Content
        'Dim valuesToFill As Content = Nothing
        'valuesToFill = New Content()
        'valuesToFill.Fields.Add(New FieldContent("YEAR", "106")) '指定YEAR填入的資料是106

        ''step3. 儲存變更
        'Using OD1 As TemplateProcessor = New TemplateProcessor(str_temppath).SetRemoveContentControls(True)
        '    OD1.FillContent(valuesToFill)
        '    OD1.SaveChanges()
        'End Using

        ''step4. 檔案下載
        'Dim buff() As Byte = Nothing
        'Response.Clear()
        'Response.ContentType = "application/octet-stream"
        'Response.AddHeader("content-disposition", "attachment;filename=" & str_NewFileName)
        'buff = File.ReadAllBytes(str_temppath)
        'File.Delete(str_temppath) '刪除檔案
        'Response.BinaryWrite(buff)
        'Response.End()
    End Sub
End Class

Step 9.最後請執行程式,看是否成功。

補充:
在開發專案過程中,遇到ListItem與TemplateEngine.Docx會有所衝突,例如以下這行程式碼:
DropDownList1.Items.Insert(0, New ListItem("請選擇項目", "0"))
看似很正常,但是Visual Studio就會針對New ListItem發現錯誤,錯誤代碼BC30516。
你只需要拿掉Imports TemplateEngine.Docx或者要明確的指定Content型態類別
再將原本這段
Dim valuesToFill As Content = Nothing
valuesToFill = New Content()
valuesToFill.Fields.Add(New FieldContent("YEAR", "106"))
程式碼改為
Dim valuesToFill As TemplateEngine.Docx.Content = Nothing
valuesToFill = New TemplateEngine.Docx.Content()
valuesToFill.Fields.Add(New TemplateEngine.Docx.FieldContent("YEAR", "106")) '學年度

沒有留言:

張貼留言