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



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

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

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

是否有任何将加载XMLSS格式的开源Java库?否则,我别无选择,只能编写一个自定义解析器:读取XML文件,然后解释单元格标记以构建单元格矩阵。在这种XML格式中,任何具有空单元格值的行都将被跳过,下一个单元格的数据定位为索引属性,作用类似于列中的偏移量,我认为这是为了节省XML文件中的空间。

该格式称为SpreadsheetML(不要与同样基于xml的。xlsx混淆),一个名为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());

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

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

遗憾的是,POI根本无法解释这个文件,这就是为什么当您试图将其包装在InputStream中并将其传递给WorkbookFactory(s)构造函数时看到异常的原因。但是,您确实有许多选项;

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

经过很多的痛苦,我已经找到了一个解决方案。JODConverter使用OpenOffice.org/LibreOffice API,可以将SpreadsheetML转换为OpenOffice.org支持的任何格式。

使用OpenOffice API可能会得到一些结果。如果不直接,你可以转换成一个"支持"的格式。除此之外,Office 2003"SpreadsheetML"的模式并不复杂。我已经成功地创建了一个xslt场景,将结果集(数据库查询)转换为(简单但有效的)Excel 2003文档(XML格式)。反过来应该不难实现。

欢呼,Wim

今天的答案是要求供应商将他们的Excel文件格式更改为Excel二进制而不是旧的Office XML。这样做允许我使用Apache POI 3.7来读取文件没有问题。我很欣赏这些回答,因为我不知道在基于java的开源库中没有对这种旧的Office XML格式的直接支持。现在我知道下次在提交到时间轴之前,应该提前检查Excel文件的格式。

我以前遇到过同样的问题,最后编写了一个SAX解析器来读取XML文件。我在这里写了一篇关于它的博文。

您可以在Github中找到解析该文件的样例项目

最新更新