52

我正在尝试在 iOS 上以编程方式创建一个 xlsx 文件。由于 xlsx 文件的内部数据基本上存储在单独的 xml 文件中,因此我尝试使用其所有文件和子目录重新创建 xlsx 结构,将它们压缩成 zip 文件并将其扩展名设置为 xlsx。我使用 GDataXML 解析器/编写器来创建所有必要的 xml 文件。但是,我得到的文件不能作为 xlsx 文件打开。即使我从有效的 xlsx 文件中提取所有数据,通过从原始 xml 文件复制数据并手动压缩它们来手动创建所有 xml 文件,我也无法重新创建有效的 xlsx 文件。

问题是:

  • xlsx 真的只是一个包含 xml 文件的存档吗?
  • 如果我不能将 xml 文件压缩为 zip 文件并将其扩展名设置为 xlsx,如何以编程方式创建有效的 xlsx 文件?
4

4 回答 4

79

在回答您的问题时:

  1. XLSX 只是一个 zip 容器中的 XML 文件集合。没有其他魔法。
  2. 如果您解压缩/解压缩一个有效的 XLSX 文件,然后重新压缩/压缩它并且您无法读取结果输出,那么问题出在压缩软件或您重新压缩的文件上。尝试不同的库/实用程序或检查它使用的默认压缩类型和级别,并尝试将其与 Excel 使用的任何内容相匹配。或者检查 zip 文件以确保目录结构得到维护。

xlsx 文件的内容示例:

unzip -l example.xlsx
Archive:  example.xlsx
  Length     Date   Time    Name
 --------    ----   ----    ----
      769  10-15-14 09:23   xl/worksheets/sheet1.xml
      550  10-15-14 09:22   xl/workbook.xml
      201  10-15-14 09:22   xl/sharedStrings.xml
      ...

我会定期解压缩 XLSX 文件,对测试进行细微更改,然后重新压缩它们,没有任何问题。

更新:重要的是要避免压缩父目录。zip这是在 Linux 或 OS X 上使用系统实用程序的示例:

# Unzip an xlsx file into a directory.
unzip example.xlsx -d newdir

# Make some valid changes to the files.
cd newdir/
vi xl/worksheets/sheet1.xml

# Rezip the files *FROM* the unzipped directory.
# Note: you could also re-zip to the original file if required.
find . -type f | xargs zip ../newfile.xlsx

# Check the file looks okay.
cd ..
unzip -l newfile.xlsx
xdg-open newfile.xlsx
于 2012-06-20T09:47:15.817 回答
35

如果我将 xlsx 文件解压缩到文件夹中,然后再次重新压缩,则 xlsx 将损坏/无法识别。就我而言,原因是我的 zip 工具使用文件夹名称作为 zip 中每个文件的相对路径的第一级。

我通过在包含 xlsx 内容的文件夹中创建一个空的 zip 文件,然后将所有文件和文件夹添加到其中来解决了这个问题。

实际上,如果您尝试压缩文件夹本身,则该文件不是有效的 xlsx。您应该进入文件夹,选择所有内容,然后右键单击并压缩。

于 2012-10-24T10:25:10.207 回答
2

我使用 WinZip 15.5 重新压缩 xlsx xml 文件。不同的压缩类型产生不同的结果。

注意:原始文件大小为 555KB。

  • .Zip:新文件大小为 3,279KB (!)。Excel 可以打开。
  • .Zipx:新文件大小 341KB。Excel无法打开。
  • Zip SuperFast:新文件大小为 606KB。Excel 可以打开。
  • 邮编 Enh。Deflate:新文件大小为 429KB。Excel无法打开。
  • Zipx bzip2:新文件大小 333KB。Excel无法打开。
  • Zipx LZMA:新文件大小 328KB。Excel无法打开。
  • Zipx PPMd:新文件大小 317KB。Excel无法打开。

结论:Zip SuperFast是唯一有效的压缩格式。

于 2019-10-21T00:00:48.423 回答
1

我遇到了问题,发现压缩在错误的文件夹级别。您需要导航到解压缩 xlsx 并压缩实际文件时创建的文件夹,而不是容器文件夹。假装我,分享我的故事,也许它可以帮助其他人节省时间......

于 2019-12-11T11:16:51.267 回答