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

标签 ios objective-c xml zip xlsx

我正在尝试使用 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 作为默认的压缩方式。我还与开发人员确认了这一点,开发人员告诉我使用 ZipCompressionLevelDefaultZipCompressionLevelFastestZipCompressionLevelBest 作为参数 compressionLevel: 将保证 DEFLATE 压缩。

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

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

我希望这个经验能帮助到一些人。

关于ios - 我应该使用哪个压缩库来在 Objective-C 中正确组装有效的 XLSX 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190939/

相关文章:

ios - 在 iOS 中以后台模式运行任务

ios - 发送到已释放实例的消息

xml - 如何让 kXML 发挥作用?

xml - 使用 SAXON for Java 将存储在字符串中的 XML 片段解析为 XSLT 中的节点

ios - 以编程方式从 super View 中删除 View 后更新约束/框架(自动布局)

objective-c - 采用 UIKeyInput 协议(protocol)从蓝牙键盘获取输入

objective-c - block 文字是否应该保留引用的堆分配 block

objective-c - 如何在标签栏应用程序的 iOS 6 GM 中使旋转正常工作?

objective-c - 使用分段控件过滤 TableView 的部分

xml - Xpath如何根据顺序选择元素并依赖于它的存在