Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java加载旧的Microsoft Office XML文件(Excel)_Java_Xml_Excel_Ms Office - Fatal编程技术网

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

如何使用Java加载旧的Microsoft Office XML文件(Excel),java,xml,excel,ms-office,Java,Xml,Excel,Ms Office,我无法将旧版Office XML格式(想想Office 2002或2003版本)的Excel文件加载到Java中。我尝试了JXL和Apache的POI(3.7版)。POI无法工作,因为它似乎需要更新的Office.xlsx格式 下面是旧的Office XML格式的一个示例 通过将工作簿保存为“XML电子表格2003”格式,可以从MS Excel 2010生成类似的XML文件 是否有任何开源Java库将加载XMLSS格式?否则,我别无选择,只能编写一个自定义解析器:读取XML文件,然后解释单元标记

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

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

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


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

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

干杯,
Wim从POI团队复制马克·比尔兹利的答案:

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

遗憾的是,POI根本无法解释此文件,这就是为什么您在尝试将其打包到InputStream并将其传递给WorkbookFactory构造函数时看到异常的原因。然而,你有很多选择

  • 您可以使用Excel本身,手动打开并保存要转换的每个文件,就像您已经做的那样
  • 如果您有权访问VisualStudio并可以编写Visual Basic或C#代码,那么您可以使用一个允许您以编程方式控制Excel的控件。通过这种方式,您可以使用Excel本身自动化文件转换过程。然后,一旦文件被转换成二进制或OpenXML格式,就可以使用POI来处理它
  • 如果您在安装了Excel副本的单机PC上运行,并且使用Windows操作系统,那么您可以使用OLE从Java代码中执行非常类似的操作。如上所述,POI可用于处理转换后的文件
  • 如果您可以访问OpenOffice,那么它有一个相当好的API,可以从Java代码访问。您可以使用它在文件类型之间进行转换,只需找到在这种情况下使用的正确过滤器即可。OpenOffice适用于除最复杂的文件之外的所有文件,您应该能够在转换后使用POI处理文件。但是,如果您选择此路径,那么最好使用OpenOffice的UNOAPI完成所有工作
  • 根据您想对文件内容做什么,您可以使用核心java代码和SAX或Xerces解析器(考虑使用xmlBeans)创建自己的解析器(http://xmlbeans.apache.org/) ). 如果您只需使用简单的文本编辑器打开原始xml文件,就可以看到该结构并不复杂,而且如果您只想获得它所包含的原始数据,那么这可能是您的最佳选择
今天的答案是要求供应商将其Excel文件格式更改为Excel二进制文件,而不是旧的Office XML。这样做允许我使用ApachePOI3.7来读取文件,而不会出现任何问题。我很欣赏这些答案,因为我不知道基于Java的开放源码库中没有对这种旧的Office XML格式的直接支持。现在我知道下次在提交时间线之前,我要检查一下Excel文件的格式。

经过一番努力,我找到了解决方法。使用OpenOffice.org/LibreOffice API,可以将SpreadsheetML转换为OpenOffice.org支持的任何格式。

该格式称为SpreadsheetML(不要与基于xml的.xlsx混淆),一个名为

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());

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


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

“否则我别无选择,只能编写…”是的,很遗憾,有时程序员实际上必须编写程序。顺便说一句,如果你真的要编写它,一定要把代码作为开源代码提供给别人,这样可以省去别人的麻烦。是的,我一直在努力避免编写例程,因为我已经过了最后期限,这个问题会让我倒退。我已经在考虑如何编写它,但不想重新发明轮子。谢谢,你的最后一个选项是我下一步要做的,因为我只想让一个进程管理文件转换。相反,我今天向BAs和供应商提出了一个案例,要求他们更改格式,他们可以很简单地将文件编写为Excel二进制格式,而不是XML格式。子弹躲闪了,因为我在最后期限内。谢谢,我下次会研究OpenOffice,因为Andrey也提到了这一选项。我会投票支持你们,但还没有代表。我会记得在我获得代表资格后投票。