【问题标题】:How to load old Microsoft Office XML file (Excel) using Java如何使用 Java 加载旧的 Microsoft Office XML 文件 (Excel)
【发布时间】:2011-08-17 07:06:07
【问题描述】:

我无法将旧 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 文件吗?

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

【问题讨论】:

  • “否则我别无选择,只能写......” 是的,遗憾的是,有时程序员实际上必须编写程序。顺便说一句 - 如果你确实必须对其进行编程,请务必将代码作为开源提供,以免其他人麻烦。
  • 是的,我试图避免编写例程,因为我在截止日期前,这个问题会让我退缩。我已经在考虑如何编写它了,但不想重新发明轮子。

标签: java xml excel ms-office


【解决方案1】:

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

【讨论】:

    【解决方案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,它有一个相当不错的 API,可以从 Java 代码访问。您可以使用它为您在文件类型之间进行转换 - 这只是发现在这种情况下使用的正确过滤器的问题。 OpenOffice 适用于除了最复杂的文件之外的所有文件,您应该能够使用 POI 来处理转换后的文件。但是,如果您选择这条路线,最好使用 OpenOffice 的 UNO api 完成所有工作。
    • 根据您要对文件内容执行的操作,您可以使用核心 java 代码和 SAX 或 Xerces 解析器创建自己的解析器(考虑使用 xmlBeans (http://xmlbeans.apache.org/))。如果您只是使用简单的文本编辑器打开原始 xml 文件,您会看到结构并不复杂,如果您只想获得它包含的原始数据,那么这可能是您的最佳选择。

    【讨论】:

    • 谢谢,您的最后一个选项是我接下来要追求的选项,因为我只想让一个进程管理文件转换。相反,我今天向 BA 和供应商提出了更改其格式的案例,他们将文件编写为 Excel 二进制格式而不是 XML 很简单。子弹躲过了,因为我在最后期限之前。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      干杯, 维姆

      【讨论】:

      • 谢谢,下次我会研究 OpenOffice,因为 Andrey 也提到了这个选项。我会投票给你们,但还没有代表。一旦我得到我的代表,我会记得投票。
      【解决方案5】:

      今天的答案是要求供应商将其 Excel 文件格式更改为 Excel 二进制文件,而不是旧的 Office XML。这样做让我可以使用 Apache POI 3.7 毫无问题地读取文件。我很欣赏这些答案,因为我不知道在基于 Java 的开源库中没有直接支持这种旧的 Office XML 格式。现在我知道下次在提交到时间线之前要早点查看 Excel 文件的格式。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多