我应该使用哪个压缩库来正确组装Objective-C中的有效XLSX文件?

tol*_*orf 6 xml zip objective-c xlsx ios

我试图使用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];
Run Code Online (Sandbox Code Playgroud)

我也尝试了其他的compressLevel参数,没有运气:

ZipCompressionLevelDefault
ZipCompressionLevelBest
ZipCompressionLevelFastest
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

从另一个问题的答案,我发现:"OOXML格式强制包中允许的唯一压缩方法是DEFLATE".

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

tol*_*orf 2

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

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

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

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

我希望这段经历可以帮助别人。