2011-04-14 23 views
1

我們有一種情況,其中Excel的XML 2003格式被廣泛用於文件上傳到第三方系統。需要從這些文件中提取一些信息用於其他處理。是否有任何可用於處理Excel 2003 XML格式的庫?是否有可用於處理(讀取)Excel 2003 XML文檔的庫

更多詳細信息:這些XML文件的格式已由第三方定義,我們無法對其進行更改。另外,數據本身不是表格或任何一致的格式。

我以前使用System.Xml.Linq從這些XML電子表格的非常簡單的版本中提取數據(基本上是一行,列索引方法)。現在所需要的數據是從更復雜的版本,其中包括合併單元格,命名範圍等

這種處理在服務器上完成,從而互操作是不是基於一種選擇此infamous MS KB about Excel on a server

可有人也建議的方法處理這些文件?

+0

Excel的一個相當不錯的高度概括。爲什麼你必須使用不同的第三方庫? – 2011-04-14 10:05:04

+0

使用Excel Interop庫通過asp.net和AFAIK進行服務器端處理需要將Excel安裝在服務器上,並且不建議這樣做(http://support.microsoft.com/kb/257757) – Ahmad 2011-04-14 10:08:30

+0

同意,這是一個完全有效的原因。 (我只是沒有看到你的問題。) – 2011-04-14 10:09:34

回答

1

最終的解決方案需要我創建一個XSLT以從文件中提取所需的數據並轉換爲非常簡單的XML數據表示形式。我還使用XmlSerializer.Deserialize()創建了代表生成XML的反序列化的對象模型的類。

但是,爲了有效地工作,需要對源Excel XML文件進行更新,以便爲需要提取的單元格包含命名範圍。使用名稱範圍允許更簡單的XSLT,但是最大的代碼-smell是依賴於我不控制的文件中命名範圍的存在。

代碼

XPathDocument doc = new XPathDocument("path to Excel xml file"); 
    XslCompiledTransform xslt = new XslCompiledTransform(); 

    StringReader sr = new StringReader(Resources.XSLT); // embedded resource, the xslt is read in as a string 
    XmlTextReader xs = new XmlTextReader(sr); 
    xslt.Load(xs); 
    XmlWriterSettings settings = new XmlWriterSettings() 
            { 
             Indent = true, 
             Encoding = Encoding.UTF8, 
             OmitXmlDeclaration = false 
            }; 

    MemoryStream memStream = new MemoryStream(); 
    using (XmlWriter writer = XmlWriter.Create(memStream, settings)) 
    { 
     xslt.Transform(doc, writer); // the simple xml..almost there 
    } 

    MyCustomClass curve; 
    { 
     XmlSerializer deSerializer = new XmlSerializer(typeof(MyCustomClass)); 
     // reset needed to beginning of mem stream since current position is the last write position 
     memStream.Position = 0; 
     curve = (MyCustomClass)deSerializer.Deserialize(memStream); 
    } 
0

您是否考慮過在您的工作室中使用xsd.exe工具來生成輕鬆讀取xml文件的類?

它不包含任何用於組合字段的智能邏輯 - 但好處是您不需要構建自己的閱讀邏輯或安裝互操作庫。

+0

我錯過了什麼 - 的XML文件已經有一個定義的模式,是存在於每個XML電子表格'工作簿xmlns =「urn:schemas-microsoft-com:office:spreadsheet 「'。這會幫助我達到什麼目的? – Ahmad 2011-04-14 10:18:21

+0

xsd.exe工具不會生成模式,但會生成.cs CSharp代碼以將辦公文件反序列化爲一組您可以操作的類。我沒有將它用於辦公室文件,但它的工作非常好,例如我的國家的稅務文件格式是各種元素的層次結構。 – Jaapjan 2011-04-14 10:20:57

+0

我認爲問題是層次結構 - 我的文件沒有。這是MS架構之後的XML格式數據。把它想象成一個報告,你可以在這個數據集中非常隨機的地方獲得信息和數據。 – Ahmad 2011-04-14 10:28:21

0

檢查CodePlex上的Excel Data Reader是否符合您的要求。我使用它將簡單的Excel數據列表導入到我們的應用程序中。

+0

不,沒用。可以用於2003的二進制格式(.xls),而不是.xxml – Ahmad 2011-04-14 11:24:03

+0

Apose Cells呢? http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/default.aspx。他們應該支持Excel 2003的SpreadsheetML格式。 – EventHorizon 2011-04-14 12:04:52

相關問題