Delphi System.Zip xlsx LibreOffice

Delphi System.Zip xlsx LibreOffice

我的系统是WIN7 64位,我使用Delphi XE7组件创建.xlsx文件。一个例子 result file.

这些文件可以用 MS Office 打开(没问题),但是用 LibreOffice 我不能,因为我有这个错误:"The file is corrupted and can't be openend ..."。怀疑 System.Zip 以某种方式错误地打包了文件。

LibreOffice Calc 没有显示任何关于为什么它无法打开我的文件的详细信息。我不知道如何开始逐项列出问题。

为了理解归档方法的原因,我做了以下操作。 解压缩文件并使用 WinRar 再次打包。 将其重命名为 *.xlsx 和 vuala。

现在可以打开了。

这是重新打包后的新文件 https://yadi.sk/i/bSr6g8xDh3Yde

我使用 XE2 System.Zip 创建了 ODS 和 XLSX 并且 OpenOffice.org 可以很好地打开它们

你能要求你的 xlsx 生成组件使用另一个 zip 引擎吗?

既然话题发起人报告说他重新打包了 zip 并上传了两个文件进行比较 - 我删除了大部分答案


因为你做了重新包装测试...

我确认两个文件之一无法在 OpenOffice 4.1.1 Win32 和 LibreOffice 4.2 上打开 Linux

Libreoffice 写入以下错误:

libreoffice4.2 ./Export.xlsx 
:1: parser error : Document is empty

^

有关错误的更多信息位于 https://bugs.documentfoundation.org/show_bug.cgi?id=91579

_

在 Windows 下无法获得错误日志,除非安装 cygwin,我没有。


好吧,我想我现在想起来了。我想我两年前犯了一个类似的错误......但是 - 如果这个假设成立 - 我设法阅读了 zip 格式规范并修复了它。许多商业 zip 库都知道新手的这个失误并默默地修复了这个错误。但是 System.Zip 按照您的指示逐字工作,因此它会将您的错误按原样传播到 XLSX 文件中。

这是我的想法,但 Whosebug 是程序员的站点,所以我请您向我们展示您的所有代码,内容存储的实现。所以我们应该能够检查您的代码并查看

我请你向我们展示你在 XML 生成器和 System.Zip 打包器之间使用的代码,当你在某个缓冲区中得到一些 spreashsheet 时 - 你究竟如何将它放入 zip-xlsx 文件中?

我的代码在这里(将生成的内容存储到 zip 文件中的确切实现)如果你关心的话:https://github.com/the-Arioch/avemey.com/tree/master/zexmlss


已添加主题启动器:

 FZipFile.Add(Data, 'xl\worksheets\sheet1.xml');

明白了! - 这里你违反了 ZIP 格式规范。回顾上面我的 lib 源及其名称修复...

  • 您应该使用普通斜杠“/”,而不是反斜杠“\”
  • 文件名不应以斜线开头,例如“/xl/worksheets/sheet1.xml”
  • 你不应该像 'xl//worksheets//sheet1.xml'
  • 那样同时使用两个斜杠

你违反了#1,你似乎没有违反#2和#3,但记住它们以后不要上当。

从磁盘打开文件允许这些怪癖并在移动中修复它们,但 zip 解析器通常不是。

另外,请考虑共同开发一个每个人都通用的库,而不是制作你自己的临时库并独自解决所有问题。