如何找出是什么原因使poi破坏了xlsx / xlsm文件

时间:2019-01-07 15:29:52

标签: java apache-poi xlsx xlsm

我有一个问题,就是Apache POI仅通过读写即可“破坏” xlsm / xlsx文件(例如,使用以下代码)

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中打开sheetsheet_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:\tmp\spreadsheet_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“破坏”文件的原因是什么?

2 个答案:

答案 0 :(得分:1)

最终,我发现调试这件事的最佳方法是两件事

  1. 打开受影响的工作簿(例如,使用7zip并使用xml编辑器(例如,记事本++>插件> XML工具>漂亮打印(仅XML-带有换行符))格式化受影响的工作表。保存文件并更新xlsm文件后,会在Excel错误日志中获取“实际”行号
  2. 如果实线行数尚未帮助比较原始xlsx文件的工作表xml文件和poi保存的工作表xml文件。您会注意到,属性方面存在差异,顺序也有所不同。为了进行正确的比较,我使用了Beyond Compare和“其他文件格式”(有关更多信息,请参见https://weblogs.asp.net/lorenh/comparing-xml-files-with-beyond-compare-3-brilliant)。也许还有另一个差异工具同样出色。

在我的情况下,问题是poi某种程度上将尺寸设置从更改为

<dimension ref="A1:XFD147"/>

<dimension ref="A1:XFE147"/>

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

答案 1 :(得分:1)

我的教授说:“数学家如何在沙漠中找到狮子? -“首先将沙漠切成两半,找出狮子在哪里,然后重复直到狮子被抓住。”

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