是否有可用于处理(读取)Excel 2003 XML文档的库

时间:2011-04-14 10:02:11

标签: c# excel .net-3.5 excel-2003

我们的情况是 Excel的XML 2003格式广泛用于向第三方系统上传文件。需要从这些文件中提取某些信息以进行其他处理。是否有可用于处理Excel 2003 XML格式的库?

更多详细信息:这些XML文件的格式已由第三方定义,我们无法对其进行更改。此外,数据本身不是表格或任何一致的格式。

我之前使用System.Xml.Linq从这些XML电子表格的非常简单的版本中提取数据(基本上是行,列索引方法)。现在需要的数据来自更复杂的版本,包括合并单元格,命名范围等。

此处理在服务器上完成,因此Interop不是基于此infamous MS KB about Excel on a server的选项

有人还建议处理这些文件的方法吗?

3 个答案:

答案 0 :(得分:1)

最终的解决方案要求我创建一个XSLT,从文件中提取所需的数据,并转换为非常简单的数据XML表示。我还使用XmlSerializer.Deserialize()创建了表示生成的XML反序列化的对象模型的类。

但是,为了有效地工作,需要对源Excel XML文件进行更新,以包含需要提取的单元格的命名范围。使用名称范围允许更简单的XSLT,但是最大的代码 - 气味是对我无法控制的文件中命名范围存在的依赖。

代码的高级概述

   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);
    }

答案 1 :(得分:0)

您是否考虑在工作室中使用xsd.exe工具生成用于轻松读取xml文件的类?

当然,它不包括用于组合字段的任何智能逻辑 - 但好处是您不需要构建自己的读取逻辑或安装互操作库。

答案 2 :(得分:0)

检查CodePlex上的Excel Data Reader是否符合您的要求。我正在使用它将Excel中的简单数据列表导入到我们的应用程序中。