Docx4J 生成的 XLSX 文件总是损坏
Docx4J Generated XLSX file is always corrupt
TL;DR: Excel Docx4J 生成的工作簿总是说已损坏但我无法确定 Excel 不喜欢底层的什么XML,更不用说如何修复了。
我的用例如下:
我正在尝试定期自动生成一个包含图表和图形的 excel 工作簿。只有原始数据会发生变化,但其他所有内容都会随着原始数据的变化而动态更新。
所以我构建了一个 excel 工作簿,其中包含许多由 sheet 原始数据生成的图表和图形。我用它作为模板。原始数据的所有值都是数字。目的是使用 Docx4J 读取此 'template' 并填充原始数据 sheet,然后将其另存为新文件,打开后将启动重新计算,图表和图形将更新。因为我是 Docx4j 的新手,所以我基本上决定先看看我是否可以打开并阅读单元格的内容来做一些小步骤;我可以。到目前为止,一切都很好。我也可以更改单元格的值,但我只能通过向控制台写入更改前的位置和值,然后是更改后的位置和值(例如 A1=45,然后是 A1=55)以编程方式验证这一点.
当我尝试打开生成的文件时,我的问题就出现了。它生成,看起来大小合适,但 Excel 声称它已损坏。它确实会尽力恢复,但最终会失败,工作簿甚至无法打开。为了进行故障排除,我打开了生成的 xlsx 并确认构成 xlsx 文件的所有各种 XML 文件均存在且可读,因此我得出结论要么是缺少某些内容,要么是 XML 的某些部分出现了对方不是Excel想要的。进一步的故障排除涉及创建一个空工作簿(无数据,1 sheet)作为我的 'template',打开它,然后用不同的名称将其保存回文件系统,然后简单地尝试查看我是否可以打开它在 Excel 但没有骰子。这让我排除了与我尝试向 sheet.
写入或添加数据有关的任何事情
相关环境信息:
- 'template' 正在 Windows 10 64 位机器上生成工作簿
- 我的 docx4j 代码正在 Debian 10 Linux 机器 运行 OpenJDK 11.0.4
- 我的 Excel 版本既可以创建 'template' 又可以打开副本 Excel for Office365
- 我是 运行 Docx4J v11.1.3 但我也尝试过 v8.1.5(这两种情况我都必须使用 JAXB 的参考实现 来绕过尝试保存时的编组错误)
我确实在 Whosebug 上看到另一个 post 关于 Linux 环境中与字体相关的问题,所以我确保安装了 MS TT Corefonts,但这对我的问题没有帮助。
我 运行 通过 BeyondCompare 解压缩的整个目录有一些差异,但我不知道哪些只是两个不同 OS' 的产物,甚至不知道哪些差异很重要。他们主要是:
- 文件大小略有不同
- 布尔值显示为“1”、"yes" 或 "true",但两个文件的显示方式不同
- 命名空间和属性在一个文件中,但不在另一个文件中
Sheet1 from my blank workbook, before and after
欢迎所有想法。
请试用刚刚发布的 docx4j 8.1.6,它修复了对最近发布的 Excel 创建的 xlsx 文件的处理。这是 https://github.com/plutext/docx4j/issues/389
TL;DR: Excel Docx4J 生成的工作簿总是说已损坏但我无法确定 Excel 不喜欢底层的什么XML,更不用说如何修复了。
我的用例如下: 我正在尝试定期自动生成一个包含图表和图形的 excel 工作簿。只有原始数据会发生变化,但其他所有内容都会随着原始数据的变化而动态更新。
所以我构建了一个 excel 工作簿,其中包含许多由 sheet 原始数据生成的图表和图形。我用它作为模板。原始数据的所有值都是数字。目的是使用 Docx4J 读取此 'template' 并填充原始数据 sheet,然后将其另存为新文件,打开后将启动重新计算,图表和图形将更新。因为我是 Docx4j 的新手,所以我基本上决定先看看我是否可以打开并阅读单元格的内容来做一些小步骤;我可以。到目前为止,一切都很好。我也可以更改单元格的值,但我只能通过向控制台写入更改前的位置和值,然后是更改后的位置和值(例如 A1=45,然后是 A1=55)以编程方式验证这一点.
当我尝试打开生成的文件时,我的问题就出现了。它生成,看起来大小合适,但 Excel 声称它已损坏。它确实会尽力恢复,但最终会失败,工作簿甚至无法打开。为了进行故障排除,我打开了生成的 xlsx 并确认构成 xlsx 文件的所有各种 XML 文件均存在且可读,因此我得出结论要么是缺少某些内容,要么是 XML 的某些部分出现了对方不是Excel想要的。进一步的故障排除涉及创建一个空工作簿(无数据,1 sheet)作为我的 'template',打开它,然后用不同的名称将其保存回文件系统,然后简单地尝试查看我是否可以打开它在 Excel 但没有骰子。这让我排除了与我尝试向 sheet.
写入或添加数据有关的任何事情相关环境信息:
- 'template' 正在 Windows 10 64 位机器上生成工作簿
- 我的 docx4j 代码正在 Debian 10 Linux 机器 运行 OpenJDK 11.0.4
- 我的 Excel 版本既可以创建 'template' 又可以打开副本 Excel for Office365
- 我是 运行 Docx4J v11.1.3 但我也尝试过 v8.1.5(这两种情况我都必须使用 JAXB 的参考实现 来绕过尝试保存时的编组错误)
我确实在 Whosebug 上看到另一个 post 关于 Linux 环境中与字体相关的问题,所以我确保安装了 MS TT Corefonts,但这对我的问题没有帮助。
我 运行 通过 BeyondCompare 解压缩的整个目录有一些差异,但我不知道哪些只是两个不同 OS' 的产物,甚至不知道哪些差异很重要。他们主要是:
- 文件大小略有不同
- 布尔值显示为“1”、"yes" 或 "true",但两个文件的显示方式不同
- 命名空间和属性在一个文件中,但不在另一个文件中
Sheet1 from my blank workbook, before and after
欢迎所有想法。
请试用刚刚发布的 docx4j 8.1.6,它修复了对最近发布的 Excel 创建的 xlsx 文件的处理。这是 https://github.com/plutext/docx4j/issues/389