Open Xml SDK 引文


什么是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

http://blog.csdn.net/francislaw/article/details/7568317


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM