如何使用Java加载旧的Microsoft Office XML文件(Excel)

我无法将旧的Office XML格式的Excel文件(认为是Office 2002或2003版本)加载到Java中。 我试过JXL和Apache的POI(版本3.7)。 POI不起作用,因为它似乎需要较新的Office .xlsx格式。

以下是一个较旧的Office XML格式的示例 。

通过将工作簿保存为“XML Spreadsheet 2003”格式,可以从MS Excel 2010生成类似的XML文件?

是否有任何开源的Java库会加载XMLSS格式? 否则,我别无select,只能编写一个自定义的parsing器:读取XML文件,然后解释单元格标签以构build单元matrix。 在这种XML格式中,任何具有空单元格值的行都被跳过,下一个单元格的数据位置的索引属性的行为类似于列中的偏移量,我假定将空间保存在XML文件中。

从POI团队复制Mark Beardsley的答案http://apache-poi.1045710.n5.nabble.com/How-to-convert-xml-to-xls-td2306602.html

你有一个Office 2003的XML文件,而不是一个OpenXML文件; 微软早期尝试为Excel创build一个基于xml的文件格式,在这个意义上说它是一种“有效”的Office文件格式。

不幸的是,POI根本无法解释这个文件,这就是为什么当你试图将它包装在InputStream中并将其传递给WorkbookFactory的构造函数时,你看到了这个exception。 然而,你有许多select;

  • 您可以使用Excel本身并手动打开并保存每个要转换的文件,就像您已经完成的一样。
  • 如果您有权访问Visual Studio,并且可以编写Visual Basic或C#代码,那么您可以使用一个控件来允许您以编程方式控制Excel。 这样,您可以使用Excel本身自动执行文件转换过程。 然后一旦文件被转换成二进制或OpenXML格式,POI就可以用来处理它。
  • 如果您正在安装Excel副本并使用Windows操作系统的独立PC上运行,则可以使用OLE来执行与Java代码非常类似的操作。 如上所述,可以使用POI来处理转换后的文件。
  • 如果您有权访问OpenOffice,则可以从Java代码访问相当好的API。 您可以使用它来为您的文件types之间进行转换 – 这仅仅是发现在这种情况下使用正确的filter的问题。 除了最复杂的文件之外,OpenOffice对于所有人都是很好的,你应该可以在转换之后使用POI来处理文件。 不过,如果你select这条路线,最好用OpenOffice的UNO api来完成所有的工作。
  • 根据你想要处理文件的内容,你可以使用核心Java代码和SAX或Xercesparsing器创build你自己的parsing器(考虑使用xmlBeans(http://xmlbeans.apache.org/))。 如果您只需使用简单的文本编辑器打开原始XML文件,则可以看到结构并不复杂,如果您只想获取其中包含的原始数据,则这可能是您的最佳select。

这个格式被称为SpreadsheetML,一个名为Xelem的库可以处理它:

 import nl.fountain.xelem.excel.Workbook; import nl.fountain.xelem.lex.ExcelReader; //... ExcelReader reader = new ExcelReader(); Workbook xlWorkbook = reader.getWorkbook("c:\\my\\spreadsheet.xml"); System.out.println(xlWorkbook.getSheetNames()); 

经过很多痛苦,我find了解决办法。 JODConverter使用OpenOffice.org/LibreOffice API,可以将SpreadsheetML转换为OpenOffice.org支持的任何格式。

您可能会使用OpenOffice API获得一些结果。 如果不是直接的,你可能会转换为“支持”的格式。 否则,Office 2003“SpreadsheetML”的架构不是很复杂。 我成功地创build了一个xslt场景,将结果集(数据库查询)转换为(简单而有效的)Excel 2003文档(XML格式)。 另一种方式应该不是很难实现。

干杯,Wim

现在的答案是要求供应商将其Excel文件格式更改为Excel二进制文件,而不是旧的Office XML。 这样做可以让我使用Apache POI 3.7来读取文件。 我很欣赏这个答案,因为我不知道这个旧的Office XML格式在基于Java的开源库中没有直接的支持。 现在我知道下一次在提交之前查看Excel文件在提交到时间线之前的格式。

前段时间我也有同样的问题,最后编写了一个SAXparsing器来读取XML文件。 我在这里写了一篇关于它的博客文章。

你可以find示例项目来parsingGithub中的文件。