網頁

2011年11月27日 星期日

OpenXML Simple Sample

Last Update: 2011/11/28 01:18+08


Intro

今次去客戶那學到了些東西!
就是這次的 OpenXML
常常都有客戶會要匯出 Word Report
過去寫這個只有麻煩, 要不直接拒絕
時代在變遷呀~囧
在 Word 2007 以後, 文件的內裡其實是XML Document
為了方便Programmer操作, 也釋出了OpenXML SDK
下面來介紹一些基本的使用



---Prepare---
Word 2007 up (廢話 XD)
OpenXML SDK (lib, tool)



---Step---
1. 建立Template
  • 開啟 開發人員(Developer) 頁籤
  • 插入 內容控制項(Content Control)
  • 檢視Word の Xml Document
2. Coding



Content


1. 建立 Template
從頭到尾用 Code 寫 Word 未免太累了
所以咱們要先建立Template

後面有用到 內容控制項
主要是為了在撰寫Code時
可以方便尋找我們要的位置
所以這是非必要的~

開啟 開發人員(Developer) 頁籤
為了在設計 Template 期間, 加入內容控制項
咱們需要先把開發人員的功能開啟來
檔案 => 選項 => 自訂功能區 => 勾選 開發人員


插入 內容控制項(Content Control)
如下圖所示
移到開發人員頁籤後, 點擊您想用的內容控制項, 就完成加入的動作了.
為了待會方便搜尋, 咱們 再來點選屬性, 輸入控制項別名(alias)
醬~ 咱們的Template就算完成了



檢視Word の Xml Document
請把Word的衣服脫了!!!
喔不, 請直接對Word點右鍵, 解壓縮!!!
如果沒這個選項, 就請先把副檔名改成 ".zip"
您會看到它的檔案結構
請開啟 word/document.xml

您可以稍微看一下內容
但其實不用太瞭解結構
之後用Code操作, 只要針對Template的長相去寫Code就好了
這邊就不廢話, 反正寫了就會瞭解


2. Coding
首先就是加入參考啦
如果沒有安裝Tool的
請到 OpenXML 安裝目錄下找 DLL 引入
有安裝的直接按加入參考選 DocumentFormat.OpenXml
另外是有可能會叫你加入 WindowsBase.dll 的參考, 就照做唄

再來就是Code
寫Code前先看一下 Word 的 Xml Document


咱們的 <w:alias ... /> 的上一層是 <w:sdtPr>
應該是Parameter的意思
同層的 <w:sdtContent> 底下的 <w:t>, 就是咱們要的
所以可以醬寫~
using (var wdDoc = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open("HelloOpenXML.docx", true)){
    //因為是Template, 所以不會為null
    var doc = wdDoc.MainDocumentPart.Document;
    //尋找所有別名(alias)
    var alias = doc.Descendants<DocumentFormat.OpenXml.Wordprocessing.SdtAlias>();
    foreach (var loop in alias){
        switch (loop.Val.Value){
            case "user_name"://若是 user_name
                //取得文字物件
                var text = loop.Parent.Parent
                    .Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>()
                    .FirstOrDefault();
                //取代原文字
                text.Text = "Your Name";
                break;
        }
    }
}

The End...


Reference

Creating Content Controls