2011-08-17 46 views
3

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

这是旧版Office XML格式的example

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

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

+0

*“否则我别无选择,只能写。” * 是的,可悲的是,有时程序员实际上要编写程序。顺便说一句 - 如果你确实需要对它进行编程,一定要提供代码作为开源以节省其他人的麻烦。 –

+0

是的,我试图避免写一个例程,因为我是在最后期限之下,这个问题会让我回头。我已经在想如何编写它,但不想重新发明轮子。 – drewxmlss

回答

0

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

干杯, 维姆

+0

谢谢,下次我会考虑OpenOffice,因为这是Andrey也提到的一个选项。我会投票给你们,但是没有代表。一旦我得到我的代言人,会记得投票。 – drewxmlss

2

复制从POI队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的构造函数时你看到了这个异常。然而,你有很多选择;

  • 您可以使用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文件,则可以看到该结构并不复杂,如果您只想获取其中包含的原始数据,则这可能是您的最佳选择。
+0

谢谢,您的最后一个选择是我下一步要追求的选择,因为我只想让一个进程管理文件转换。相反,我今天向BA和供应商提出了更改格式的情况,他们很容易将文件编写为Excel二进制格式而不是XML。子弹躲过了,因为我在最后期限之下。 – drewxmlss

0

答案今天是要求供应商自己的Excel文件格式转换到Excel二进制,而不是旧的Office XML。这样做使我可以使用Apache POI 3.7读取文件而不会出现问题。我很欣赏这些答案,因为我不知道这种旧的Office XML格式在基于Java的开源库中没有直接的支持。现在我知道下一次在提交时间表前查看Excel文件的格式。

1

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

2

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

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

您可以找到样本项目来解析该文件中Github

相关问题