6

我正在尝试使用 Objective-C 以编程方式修改 XLSX 文件。

到目前为止,我只修改其中一张纸上的数据。我正在采取的步骤如下:

  • 将 XLSX 文件复制到 Documents 文件夹
  • 在保持目录结构的情况下解压 XLSX 容器
  • 解析相应的工作表 XML 文件(在我的例子中是 sheet2.xml)
  • 添加一些行
  • 重写 XML 结构并保存
  • 将更新的 XML 文件放回 XLSX 容器中

但是,新的 XLSX 文件会损坏。我使用GDataXML进行 XML 解析/写入,使用Objective-Zip进行压缩/解压缩。

我知道我创建的 XML 文件是正确的,因为当我手动解压缩并重新压缩损坏的 XLSX 文件时,它打开时没有任何错误。我在 OS X(使用 Unarchiver)和 Windows(使用 7-Zip)上都做过这个。

问题要么在于 Objective-Zip 库,要么在于我使用它的方式。下面是我如何实现压缩方法:

ZipFile *zipFile = [[ZipFile alloc] initWithFileName:XLSXDocumentsFilePath mode:ZipFileModeAppend];
ZipWriteStream *stream= [zipFile writeFileInZipWithName:XLSX_WORKSHEET_XML_SUBPATH compressionLevel:ZipCompressionLevelNone];
[stream writeData:data];
[stream finishedWriting];
[zipFile close];

我还尝试了其他可用的compressionLevel参数,但没有成功:

ZipCompressionLevelDefault
ZipCompressionLevelBest
ZipCompressionLevelFastest

我的问题是:

  • 我应该使用哪个压缩库以编程方式创建有效的 XLSX 文件?
  • 如果 Objective-Zip 合适,我的代码有什么问题?

从另一个问题的答案中,我发现:“OOXML 格式规定包中允许的唯一压缩方法是 DEFLATE”。

是否可以强制 Objective-Zip 使用 DEFLATE?或者是否有使用 DEFLATE 的开源 iOS 压缩库?

4

1 回答 1

2

我在做一些研究并与 Objective-Zip 的开发者flydolphinstudio进行了一对一的通信后找到了答案。

首先,Objective-Zip 使用 DEFLATE 作为默认压缩方法。我还与开发人员确认了这一点,他告诉我使用ZipCompressionLevelDefault,ZipCompressionLevelFastestZipCompressionLevelBest作为参数compressionLevel:将保证 DEFLATE 压缩。

所以,问题出在mode:论点上,就ZipFileModeAppend我而言。MiniZip 似乎没有删除 zip 文件中文件的方法,这就是为什么我没有覆盖现有文件,而是添加一个新文件的原因。为了更清楚,看看我的xl/worksheets文件夹在使用 Objective-Zip 压缩后的样子: 工作表文件夹

因此,创建有效 XLSX 容器的唯一方法是从头开始创建 zip 文件,方法是添加所有文件并保持目录/文件结构完整。

我希望这段经历能帮助一些人。

于 2013-03-04T22:09:42.867 回答