如何找出导致poi损坏xlsx/xsm文件的原因



我遇到的问题是,Apache POI仅通过读取和写入(例如,使用以下代码)就"损坏"了xlsm/xsx文件

public class Snippet {
public static void main(String[] args) throws Exception {
String str1 = "c:/tmp/spreadsheet.xlsm";
String str2 = "c:/tmp/spreadsheet_poi.xlsm";
// open file
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File(str1)));
// save file
FileOutputStream out = new FileOutputStream(str2);
wb.write(out);
wb.close();
out.close();
}
}

一旦你在Excel中打开spreadsheet_poi.xlsm,你会得到一个错误,如下面的

"我们在xxx中发现一些内容有问题。您希望我们尽可能多地恢复吗…"?

如果你同意,你最终会得到一个日志,它可能看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error145040_01.xml</logFileName>
<summary>Errors were detected in file 'C:tmpspreadsheet_poi.xlsm'</summary>
<repairedParts>
<repairedPart>Repaired Part: /xl/worksheets/sheet4.xml part with XML error.  Load error. Line 2, column 0.</repairedPart>
<repairedPart>Repaired Part: /xl/worksheets/sheet5.xml part with XML error.  Load error. Line 2, column 0.</repairedPart>
<repairedPart>Repaired Part: /xl/worksheets/sheet8.xml part with XML error.  Load error. Line 2, column 0.</repairedPart>
</repairedParts>
</recoveryLog>

更详细地调试问题的最佳方法是什么(例如,找出是什么导致poi"损坏"文件?

最终,我发现调试这一问题的最佳方法是

  1. 打开受影响的工作簿(例如,使用7zip并使用xml编辑器格式化受影响的工作表(例如,记事本++>插件>xml工具>漂亮打印(仅限xml-带换行符))。保存文件并更新xlsm文件后,您将在Excel错误日志中获得"真实"行号。备选选项(我还没有尝试,但应该根据POI邮件列表工作:使用OOXMLPrettyPrint(https://svn.apache.org/repos/asf/poi/trunk/src/ooxml/java/org/apache/poi/ooxml/dev/)格式化文件,然后在excel中重新打开它
  2. 如果实际的行号还没有帮助比较原始xlsx文件和poi保存的图纸xml文件。您会注意到,在属性方面存在差异,而且顺序也不同。为了正确比较,我使用了Beyond compare与"其他文件格式"(请参阅https://weblogs.asp.net/lorenh/comparing-xml-files-with-beyond-compare-3-brilliant获取更多信息)。也许还有另一个diff工具同样好

在我的案例中,问题是poi以某种方式更改了的维度设置

<dimension ref="A1:XFD147"/>

<dimension ref="A1:XFE147"/>

(XFE是一个不存在的列)。我通过删除原始xlsx文件中的许多空列来修复它。

我的教授说:"数学家如何在沙漠中找到狮子?"-"首先将沙漠一分为二,找出狮子在哪里,然后重复,直到狮子被抓住"。

因此,请尝试从Excel文件中删除功能,尝试不同的版本,直到找到根本原因。不过,可能有多种原因。

最新更新