什么是Open Xml SDK?
什么是Open Xml?
首先,我們得知道,Open Xml為何物?
我們還是給她起個名字——就叫 “開放Xml”,以方便我們中文的閱讀習慣。之所以起開放這個名字,因為以前有接觸過Open Authorization,可以稱為開放授權,比如OpenID之類的。
“Open XML標准的簡單介紹:Ecma Office Open XML(“Open XML”)是針對字處理文檔、演示文稿和電子表格的國際化開放標准,可免費供多個應用程序在多個平台上實現。Microsoft Office(2007、2003、XP、2000)、OpenOffice Novell Edition、開源項目 Gnumeric、Neo-Office 2.1 和 PalmOS (Dataviz) 已經支持 Open XML。Corel 已經宣布在 WordPerfect 2007 中提供 Open XML 支持,全球的開發人員正在使用 OpenXML 構建解決方案。
Open XML 的標准化工作是由 Ecma International 通過其技術委員會 45 (TC45) 執行的,來自 Apple、Barclays Capital、BP、The British Library、Essilor、Intel、Microsoft、NextPage、Novell、Statoil、Toshiba 和 United States Library of Congress 的代表參與了該項工作。該標准旨在提供現有 ISO 標准所無法提供的獨特好處,其中包括能夠實現從現有二進制格式向基於 XML 的格式的高保真移植。”
什么是Open Xml SDK?
順理成章,Open XML SDK特指微軟Office的開放XML,且提供了一套操作的SDK組件。
故而,我們的關注點也就停留在微軟的Word,PPT,Excel這三個產品上。
這樣,我們就可以做很多事情了,如:查找替換,創建圖形,分析數據,移動幻燈片等等,你能夠想得到的Office操作,都可以用Code給表達出來,就看你有多大Power。
怎樣獲得?
這是個必備的內容。
首先,作為一個文檔的完整性需要,是必備的;
其次,我想賣弄一下我知道的資源獲取方式;
所以,我還是厚着臉皮地使之流水賬:
1)MSDN下載;http://www.microsoft.com/en-us/download/details.aspx?id=5124 ;
2)我的百度雲盤:http://pan.baidu.com/s/1c0iYgxU 密碼:r8yl;
3)Nuget:Install-Package DocumentFormat.OpenXml;
4)VS:工具——>擴展和更新,選擇聯機——>輸入openxml,即可安裝。
怎樣裝配開發環境?
只需引入如下程序集即可:
1)DocumentFormat.OpenXml
2)WindowsBase
怎樣理解SDK?
數據結構
之所以起用“數據結構”這四個字,表明將要突出的是重點。
“SDK是用來操作XML的,且XML是用樹形結構組織。”(是否想到了DOM樹,Jquery的查詢化API,.NET中XML命名空間,Linq To XML,組合模式。。。。。。)
1)首先,由於WORD,PPT,EXCEL都可以表示為XML文件,或者XML Package,所以,我們必須熟悉XML標記語言(ML)的語法,如元素,屬性,文本,根等。
代碼角度:聯系你自己編程語言中的,操作XML的API。
2)其次,XML是樹形的,那么據此推測SDK中,要么提供能夠操作XML API,要么調用一般的XML API。SDK選擇了前者。
SDK 揭秘
基於SDK本質上就是對樹的訪問的理由,我們有必要關注幾個特殊的類:
OpenXmlElement
摘要:Represents a base class that all elements in an Office Open XML document derive from.
它的作用即為所有元素的一種抽象,如果去掉了Open,就變成了XmlElement,熟悉Xml的你,是否會想起什么?
其提供了大量的關於XML的API,將XML內聯化:
InnerText,InnerXml,HasChildren,LastChild,Ancestors,Elements<T>,ElementsAfter,RemoveChild<T>等等。
OpenXmlCompositeElement
摘要:Represents the base class for composite elements.
同樣地,提供了大量的操作XML的API:
public override T AppendChild<T>(T newChild); public override T InsertAfter<T>(T newChild, OpenXmlElement refChild); public override T InsertAt<T>(T newChild, int index); public override T InsertBefore<T>(T newChild, OpenXmlElement refChild); public override T PrependChild<T>(T newChild); public override void RemoveAllChildren(); public override T RemoveChild<T>(T oldChild); public override T ReplaceChild<T>(OpenXmlElement newChild, T oldChild);
WordprocessingML中的很多元素皆從其派生,如:
Paragraph
Table
Run
OpenXmlLeafElement與OpenXmlLeafTextElement
OpenXmlLeafElement摘要:Represents the base class from which leaf elements are derived.
OpenXmlLeafTextElement摘要:Represents the base class from which leaf elements that have text are derived.
其中,帶文本的葉子元素從葉子元素派生。如:WordprocessingML中的Text
怎樣使用SDK?
到這里,我不想繼續枚舉SDK內部的類與摘要,那是很枯燥的事情。
因為OpenXmlElement,OpenXmlCompositeElement,OpenXmlLeafElement與OpenXmlLeafTextElement,已足夠覆蓋其面貌。
Eg:使用的代碼片段:查找某個表格,並按照格式插入一行。
[Test] public void Usage_Test() { using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(@"F:\數據報告模板.docx", true)) { // Assign a reference to the existing document body. Body body = wordprocessingDocument.MainDocumentPart.Document.Body; var table = body.Elements<Table>().ElementAt(1); //查找某表 var row = table.Elements<TableRow>().ElementAt(1).Clone() as TableRow; //復制某行 var cells = row.Elements<TableCell>(); //所有Cell List<string> list = new List<string>() { "pz", "0", "dn", "0" }; //假設為四列表格 for (int ii = 0; ii < 4; ii++) { var cell = cells.ElementAt(ii); Paragraph tmpPa = cell.Elements<Paragraph>().FirstOrDefault(); var tmpRun = tmpPa.Elements<DocumentFormat.OpenXml.Wordprocessing.Run>().FirstOrDefault(); var tmpText = tmpRun.Elements<DocumentFormat.OpenXml.Wordprocessing.Text>().FirstOrDefault(); Console.WriteLine(tmpText.Text); tmpText.Text = list[ii]; //Update } var lastRow = table.Elements<TableRow>().Last(); table.InsertAfter<TableRow>(row, lastRow); } }
參考文獻
SDK MSDN教程(Official,首選。請注意左側的三個子菜單:”入門”、”了解Open XML格式”、”如何實現…”):http://msdn.microsoft.com/zh-cn/library/bb448854(v=office.14).aspx
http://msdn.microsoft.com/zh-cn/library/gg278308(v=office.14).aspx
http://msdn.microsoft.com/zh-cn/library/cc850837(v=office.14).aspx
OPEN XML 百度百科 簡介:
http://baike.baidu.com/view/1201978.htm
博客相關文章(待你去考證):
http://www.cnblogs.com/weu135/archive/2013/03/31/2991565.html
http://www.cnblogs.com/xuanhun/archive/2011/05/31/2065024.html