3

我通过 apache POI 库编写 XLSX 文件。(我已经尝试使用 POI 3.8 beta1 到 beta 4)。当我尝试通过 Excel 2007 打开 XLSX 文件时,它给了我一个错误,即工作表包含不可读的内容,然后 excel 询问我是否应该修复它。

我的问题是我的程序生成一个 XLSX 文件,而另一个程序通过 POI 事件 API 读取它。当我通过事件 API 读取维度 XML 时,我发现它不是 A1:500Z(假设 excel 有 500 行和 26 列)它只读取 A1。我已经看到,只有当工作表为空时,工作表的尺寸才为 A1,但在我的情况下,工作表有 500 行数据。所以XLSX写代码有问题,导致维度设置不正确。(我认为这一定是excel抛出不可读内容错误的原因)。

我浏览了 POI 邮件列表,其中提到了这个不可读的内容错误,但无济于事。

XLSX 文件创建代码相当简单,所以我怀疑那里一定有什么问题,(并且这种错误行为只发生在要写入的工作表的数据大于 100 行的情况下)。

有没有人遇到过这样的问题?或者 POI 库本身有什么问题(他们的邮件列表确实显示不可读的内容错误)?

4

3 回答 3

3

这里有同样的问题。如果您解压缩 xlsx 并查看文件“xl/worksheets/sheet1.xml”,您将始终阅读

<worksheet>
 <dimension ref="A1"/>
 <sheetViews>
  <sheetView ...

无论添加了多少行和单元格。

我在 apache 的错误跟踪器上提交了一个错误:https ://issues.apache.org/bugzilla/show_bug.cgi?id=53611

[编辑]在 bugtracker 上, Ryan https://issues.apache.org/bugzilla/show_bug.cgi?id=53611#c3
发布了一个解决方法

CTWorksheet ctSheet = wb.getXSSFWorkbook().getSheetAt(0).getCTWorksheet();
ctSheet.getDimension().setRef("A1:D47");

因此,您必须跟踪您创建的列和行,并自己为每张工作表设置维度标签。

这是我的结果代码:

private void updateDimensionRef(Sheet sheet, int columnIndex, int rowNumber) {
    ((XSSFSheet) sheet).getCTWorksheet().getDimension()
        .setRef("A1:" + CellReference.convertNumToColString(columnIndex) + rowNumber);
}

[编辑#2]

它已在 3.16-beta1 版本中修复。请参阅变更日志(错误 #53611)。

于 2012-07-27T13:11:12.257 回答
0

我也有同样的问题。奇怪的是,Open Office 打开这个文件没有任何错误(但由于某种奇怪的原因丢失了分组)。我禁用了代码中的分组,一切正常。所以看起来它是 Apache POI 行分组错误。

于 2011-09-27T04:09:24.927 回答
0

我不知道 POI 中有任何与不正确的维度记录有关的未解决的错误。如果您能够生成一个小测试用例,使用 XSSF 生成一个简单的 xlsx 文件来解决问题,我强烈建议您在POI Bugzilla中打开一个新错误,以便对其进行跟踪和修复。

邮件列表中内容不可读的最常见原因是人们使用旧版本的库(现在修复了一个错误),或者人们试图主要手工制作自己的 xlsx 文件(使用 BigGridDemo 风格的方法)。后者通常通过切换到新的 SXSSF 流式写入方式来解决。

(当修复有问题的文件时,Excel 通常会为您提供一个包含错误详细信息的 xml 文件,但不知道它说的是什么,很难确定到底出了什么问题)

于 2011-08-26T16:16:00.060 回答