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

时间:2011-08-17 07:06:08

标签: java xml excel ms-office

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

这是旧版Office XML格式的example

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

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

6 个答案:

答案 0 :(得分:4)

格式称为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());

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

干杯, 维姆

答案 4 :(得分:0)

今天的答案是要求供应商将其Excel文件格式更改为Excel二进制文件而不是旧的Office XML。这样做允许我使用Apache POI 3.7来读取文件而没有任何问题。我很感激答案,因为我不知道在这个旧的Office XML格式的基于Java的开源库中没有直接的支持。现在我知道下次检查之前要查看Excel文件在提交时间轴之前的格式。

答案 5 :(得分:0)

前段时间我遇到了同样的问题,最后编写了一个SAX解析器来读取XML文件。我写了一篇关于它的博客文章here

您可以找到示例项目来解析Github中的文件。