我无法将较旧的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文件中节省了空间。
答案 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)构造函数时看到异常的原因。但是你有很多选择;
答案 2 :(得分:1)
答案 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)