Open XML 入門篇

一、   OFFICE OPEN XML 簡介

Office Open XML (OpenXML) 是一項針對字處理文檔、演示文稿和電子表格的建議開放標
準,可由多個應用程序在多個平臺上自由地實施。不管是要實施支持該格式的應用程序
的組織、採購此類軟件的商業實體和政府實體還是從事該格式教學的教育者或作家,都
會因這種標準的發佈而獲益。最終,所有用戶都可以享受“所有文檔,一種 XML 標準”
所帶來的好處,包括穩定性、持久保存性、互操作性和正在進行的其他改進。
OpenXML 的標準化工作是由 Ecma International 通過其 Technical Committee 45(技術委員
會 45,TC45)執行的,來自 Apple、Barclays Capital、BP、英國國家圖書館 (The British
Library)、Essilor、Intel、Microsoft、NextPage、Novell、Statoil、Toshiba 和美國國會圖書館
(United States Library of Congress) 的代表參與了該項工作

隨着20世紀90年代XML的出現,企業計算客戶開始逐漸認識到,在他們所依賴的計算機產品和應用中

採用開放的格式和標準所帶來的商業價值。IT專業人員將從通用的數據格式中受益匪淺,這種格式可

能是XML,因爲它擁有被應用程序、平臺和Internet瀏覽器讀取的能力。

同樣,隨着在Microsoft Office 2000中對於XML格式的支持與採用,開發人員開始認識到,他們需要將以前的Microsoft Office版本中的二進制文件格式轉換爲XML格式。二進制文件(.doc,.dot,.xls,以及.ppt文件)在過去幾年中一直肩負着存儲和轉換數據的重任,而現在它們無法滿足新的市場需求的挑戰,其中

包括輕鬆地在異構應用之間傳遞數據,以及允許用戶從這些數據中搜集商業信息。

2007 Microsoft Office system爲Microsoft Office Excel 2007,Microsoft Office Word 2007,和Microsoft Office PowerPoint 2007採用了基於XML的文件格式,從而延續了這種轉移。新的文件格式,稱爲Office Open XML格式,解決了上述市場需求的問題,同時改變了您基於Microsoft Office文檔建立解決方案的方式。

新的格式增強了文件與數據的管理能力,數據恢復能力,以及與業務線系統的互操作能力。它們是對早期版本的二進制文件的擴展。任何支持XML的應用程序都可以訪問新文件格式當中的數據,並與之協同工作。這些應用程序並不需要成爲Microsoft Office system或Microsoft產品的一部分。用戶也可以使用標準的轉換來提取或重新組織數據。另外,有關安全性的擔憂也大大的降低,因爲信息是存儲在XML當中的,它從本質上來講都是純文本的。因此,數據可以沒有任何障礙地通過企業防火牆進行傳遞。

注意:

不要將Office Open XML格式與Microsoft Windows XML Paper Specification格式相混淆。

Office Open XML格式使用Open Packaging ConventionsXML Paper Specification (XPS)也使用它。

但是,這兩種格式在許多重要的方面是不同的。XPS是一個頁面內的,固定的文檔格式,它是在Microsoft Windows Vista操作系統當中所引入的。而Office Open XML格式是面向Office Word 2007,Office Excel 2007,和Office PowerPoint 2007的完全可編輯的文件格式。雖然它們在XML和ZIP壓縮的使用方面有很多相似的地方,但是它們在文件格式的設計和使用目的上還是有着很大的不同。

 

新的文件格式的容器是基於簡單的分部分的壓縮的ZIP文件格式。在新的Office Open XML格式的核心使用一些XML的引用架構和一個ZIP容器。每個文件都是由一些部件的集合組成的;這個集合定義了文檔。

文檔部件是存儲在容器文件當中,或者存儲在基於工業標準的ZIP格式的包中。許多部件都是用來描述應用程序數據,元數據,以及自定義數據的XML數據,它們都是存儲在容器文件當中的。其它非XML部件,也可以包含在容器包當中,其中包括在文檔中表示圖片或者嵌入的OLE對象的二進制文件。另外,還有一些關係部件,它們指定了部件之間的關係;這種設計方式爲Office文件提供了結構。部件組成了文件的內容,而關係描述了這些內容如何組織在一起。

Office文檔的XML文件格式緊密的集成在一起,但是它們是模塊化的,並且具有高度的靈活性。在下面的一些章節中,詳細地描述了Office XML格式的每個組成部分。它們也使用新的文件格式描述了Office應用程序。

注意:

爲了理解一個Office XML格式文件的組成,您可以希望提取一個文件。爲了打開文件,您可以使用一個ZIP應用程序,例如將WinZip(來自WinZip Computing Corporation)安裝到您的計算機當中。

 

二、 asp.net操作OpenXML文檔

如果確定ASP .NET應用程序僅處理Office 2007生成的OpenXML格式文檔,那麼使用OpenXML SDK是一個更好的主意,因爲它不需要在服務器上安裝Office,對客戶端也沒有任何要求,只要用的是OpenXML格式的文檔就可以了。因爲OpenXML格式已提交國際標準化組織,所以,用戶可以使用支持OpenXML的任何應用程序讀取和編輯該文檔。

使用該方案需要下載OpenXML SDK,並使用其進行開發,目前該SDK還只是一個CTP版本。下面的代碼演示瞭如何使用OpenXML SDK讀寫OpenXML格式的Excel文件:

//怎樣獲取WorkSheet信息
public List<string>XLGetSheetInfo(string fileName)
{
//用所有的sheet添充這個集合
List<string>sheets=new List<string>();
using(SpreadsheetDocument xlPackage=SpreadsheetDocument.Open(fileName,false))
{
WorkbookPart workbook=xlPackage.WorkbookPart;
Stream workbookstr=workbook.GetStream();
XmlDocument doc=new XmlDocument();
doc.Load(workbookstr);
XmlNamespaceManager nsManager=new XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace("default",doc.DocumentElement.NamespaceURI);
XmlNodeList nodelist=doc.SelectNodes("//default:sheets/default:sheet",nsManager);
foreach(XmlNode node in nodelist)
{
string sheetName=string.Empty;
sheetName=node.Attributes/["name"/].Value;
sheets.Add(sheetName);
}
}
return sheets;
}
//怎樣爲一個Excel文檔創建一個新的包
public static void CreateNewExcelDocument(string document)
{
using(SpreadsheetDocument
xcelDoc=SpreadsheetDocument.Create(document,preadsheetDocumentType.Workbook))
{
//設置文檔內存以便Excel能夠打開
WorkbookPart mainPart=excelDoc.AddWorkbookPart();
SetMainDocumentContent(mainPart);
}
}
//設置主文檔部分內存
public static void SetMainDocumentContent(WorkbookPart part,string excelXml)
{
using(Stream stream=part.GetStream())
{
byte/[/]buf=(new UTF8Encoding()).GetBytes(docXml);
stream .Write(buf,0,buf.Length);
}
}
三、asp.net中操作word(2007) 文檔
有的時候我們需要在程序中處理Word文檔,比如,刪除或替換掉文檔中的某些字符串,實現這個功能有
很多方法,我這裏介紹一種方法,個人認爲其效率要優於其它方法,但本方法目前只適用於office 2007 中
的Excel,Word, PowerPoint. 下面引用一些msdn上關於office 2007的介紹. 
2007 Microsoft Office system爲Microsoft Office Excel 2007,
Microsoft Office Word 2007,和Microsoft Office PowerPoint 2007採用了基於XML的文件格式,
新的格式增強了文件與數據的管理能力,數據恢復能力,以及與業務線系統的互操作能力。它們是對早
期版本的二進制文件的擴展。任何支持XML的應用程序都可以訪問新文件格式當中的數據,並與之協同工
作。這些應用程序並不需要成爲Microsoft Office system或Microsoft產品的一部分。用戶也可以
使用標準的轉換來提取或重新組織數據。另外,有關安全性的擔憂也大大的降低,因爲信息是存儲在XML
當中的,它從本質上來講都是純文本的。因此,數據可以沒有任何障礙地通過企業防火牆進行傳遞。
注意:
不要將Office Open XML格式與Microsoft Windows XML Paper Specification格式相混淆。
Office Open XML格式使用Open Packaging Conventions,XML Paper Specification (XPS)也
使用它。但是,這兩種格式在許多重要的方面是不同的。XPS是一個頁面內的,固定的文檔格式,它是在
Microsoft Windows Vista操作系統當中所引入的。而Office Open XML格式是面向Office Word 2007,
Office Excel 2007,和Office PowerPoint 2007的完全可編輯的文件格式。雖然它們在XML和ZIP
壓縮的使用方面有很多相似的地方,但是它們在文件格式的設計和使用目的上還是有着很大的不同。
更詳細的信息請參考:
http://www.microsoft.com/china/msdn/library/office/office/OfficeOpenXMLFormats.mspx?mfr=true

爲了打開一個Word 2007 XML文件

1. 創建一個臨時目錄來存儲文件和它的部件。
2. 創建一個Word 2007文檔,包括文本,圖片,以及其它元素,保存爲一個.docx文件。
3. 在文件名的末端添加一個.zip擴展名。
4. 雙擊文件。這時將會在ZIP應用程序當中打開該文件。您可以查看組成文件的每個部件。
(可以不用winrar壓縮工具打開,以windows默認的zip格式打開)
5. 將這些部件提取到剛纔創建的臨時目錄當中。

這時就可以看到組成docx文件的所有XML格式的文件.這裏需要大家詳細閱讀一下我上面給的鏈接的
內容,現在我主要介紹一下在.net中處理word(2007)文檔的一種方法,需要說明的是在
.net frameword 2.0 中並沒有提供相關的類來處理zip格式的文件,在.net framework 3.0中提供
了一個類Package,所屬的命名空間爲System.IO.Packaging,因此在本例中要實現對word文檔的處
理必須安裝.net frameword 3.0 或者 3.5,在引用中要添加對WindowsBase.dll的引用,這個DLL
文件在windows 2003 系統裏位於
C:/Program Files/Reference Assemblies/Microsoft/Framework/v3.0/目錄下.
我做的這個例子是替換Word頁腳中的鏈接,將http://www.google.cn/
替換爲http://blog.csdn.net/.其它的處理可以用類似的方法來操作.下面是代碼:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.IO.Packaging;

namespace WordProcess
{
    class Program
   {
        static void Main(string[] args)
      {
           string filePath = "test.docx"; 
           string content = null;

           string contentType;
           CompressionOption option;
            PackageRelationshipCollection relations;

            try
            {
                
              //打開docx文件
           using (Package zip = System.IO.Packaging.Package.Open(fileZip, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {

                  foreach (PackagePart part in zip.GetParts())
                  {
                      //尋找頁腳所在的文件
                     if (part.Uri.OriginalString == "/word/footer2.xml")
                       {
                          StreamReader sr = new StreamReader(part.GetStream());
                            content = sr.ReadToEnd();
                           //替換內容
                          if (content != null)
                              content = content.Replace("http://www.google.cn", http://blog.csdn.net);
                           sr.Close();

                            contentType = part.ContentType;
                           option = part.CompressionOption;
                          relations = part.GetRelationships();

                        //刪除 footer2.xml
                           zip.DeletePart(part.Uri);

                           //創建一個新的 footer2.xml
                           Uri tempUri = PackUriHelper.CreatePartUri(new Uri("/word/footer2.xml", UriKind.Relative));
                           PackagePart tempPart = zip.CreatePart(tempUri, contentType, option);

                           //將修改後的 footer2.xml
                           using (StreamWriter sw = new StreamWriter(tempPart.GetStream()))
                         {
                               sw.Write(content);
                               sw.Flush();
                                sw.Close();
                          }

                           //創建tempart與各XML文件之間的關係,非常重要
                            foreach (PackageRelationship relation in relations)
                         {
                              tempPart.CreateRelationship(relation.TargetUri, relation.TargetMode, relation.RelationshipType, relation.Id);
                            }

                           zip.Close();

                           break;
                       }
                  }
               }
           }
          catch (Exception ex)
          {
               throw new Exception(ex.Message);
           }
       }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章