通过Apache POI读取XLSM工作簿时出现异常

时间:2012-02-14 12:18:48

标签: java apache-poi

我正在尝试使用Apache POI库(3.8-beta5)读取.xlsm文件:

Workbook wb = null;
try {
    wb =  WorkbookFactory.create(isXLSFile);
} catch (IOException e) {
...
没什么复杂的。虽然通常可以很好地阅读文档,但是一个文档会抛出异常:

Caused by: java.lang.IllegalStateException: A sheet hyperlink must either have a location, or a relationship. Found:
<xml-fragment ref="H13" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"/>
    at org.apache.poi.xssf.usermodel.XSSFHyperlink.<init>(XSSFHyperlink.java:72)
    at org.apache.poi.xssf.usermodel.XSSFSheet.initHyperlinks(XSSFSheet.java:250)
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:203)
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:175)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:260)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:174)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:67)

有趣的是,如果我在LibreOffice中打开文件(我的机器上没有MS Office)并重新保存(保留格式),那么文档就可以正常读取。据我所知,这个问题与文档结构的有效性有关 - 所以这是数据问题而不是库代码中的错误(或者不是吗?)。但也许有办法抑制这些错误?

[更新] 2012年3月26日发布的3.8版本的Apache POI中集成了对已接受答案的评论中提到的修复。

1 个答案:

答案 0 :(得分:1)

我刚从Google Refine错误报告中的用户那里得到了这样的文件。我的结论是,它是一个Apache POI错误,他们因抱怨未使用的引用而过于严格。此外,抛出RuntimeException而不是声明(已检查)异常是一种粗鲁的行为。我已提交此错误报告:https://issues.apache.org/bugzilla/show_bug.cgi?id=52716