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

标签 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 中打开电子表格_poi.xlsm 后,您将收到如下错误

“我们发现 xxx 中的某些内容存在问题。您希望我们尽力恢复...”吗?

如果您选择"is",您最终会得到如下所示的日志:

<?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“损坏”文件?

最佳答案

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

  1. 打开受影响的工作簿(例如使用 7zip 并使用 xml 编辑器格式化受影响的工作表(例如 Notepad++ > 插件 > XML 工具 > pretty-print (仅限 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 文件中的许多空列来修复它。

关于java - 如何找出导致 poi 损坏 xlsx/xlsm 文件的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54077244/

相关文章:

java - elasticsearch 6.3.2 的 NestedSortBuilder 使用示例

java - Apache POI : How to write numbers in scientific format

java - 如何使用 [Apache POI] 创建依赖下拉列表

java - 我需要用java读取xlsx文件

java - 在 Android 上解析 ~1 MB JSON 非常慢

java - 在类中创建和更改的类会更改原始类

java - 在 Apache POI 中创建单元格时出现空指针异常

go - 下载的 excelize xlsx 文件已损坏

javascript - 如何为(导出到 .xlsx)SheetJS js-xlsx : https://github. com/SheetJS/js-xlsx 的单元格数据设置公式

java - 我重复收到 "Authentication did not succeed for user ID"20 次