最終的解決方案需要我創建一個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);
}
Excel的一個相當不錯的高度概括。爲什麼你必須使用不同的第三方庫? – 2011-04-14 10:05:04
使用Excel Interop庫通過asp.net和AFAIK進行服務器端處理需要將Excel安裝在服務器上,並且不建議這樣做(http://support.microsoft.com/kb/257757) – Ahmad 2011-04-14 10:08:30
同意,這是一個完全有效的原因。 (我只是沒有看到你的問題。) – 2011-04-14 10:09:34