我正在尝试使用 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 合适,我的代码有什么问题?
来自answer对于另一个问题,我发现:“OOXML 格式规定包中唯一允许的压缩方法是 DEFLATE”。
是否可以强制 Objective-Zip 使用 DEFLATE?或者是否有使用 DEFLATE 的开源 iOS 压缩库?
最佳答案
我在做一些研究并与 Objective-Zip 的开发人员进行一对一通信后找到了答案,flyingdolphinstudio .
首先,Objective-Zip 使用 DEFLATE 作为默认的压缩方式。我还与开发人员确认了这一点,开发人员告诉我使用 ZipCompressionLevelDefault
、ZipCompressionLevelFastest
或 ZipCompressionLevelBest
作为参数 compressionLevel:
将保证 DEFLATE 压缩。
所以,问题出在 mode:
参数上,在我的例子中是 ZipFileModeAppend
。 MiniZip 似乎没有删除 zip 文件中文件的方法,这就是为什么我不覆盖现有文件,而是添加一个新文件的原因。为了更清楚,看一下我的 xl/worksheets
文件夹在使用 Objective-Zip 压缩后的样子:
因此,创建有效 XLSX 容器的唯一方法是从头开始创建 zip 文件,方法是添加所有文件并保持目录/文件结构不变。
我希望这个经验能帮助到一些人。
关于ios - 我应该使用哪个压缩库来在 Objective-C 中正确组装有效的 XLSX 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190939/