tol*_*orf 6 xml zip objective-c xlsx ios
我试图使用Objective-C以编程方式修改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)
我的问题是:
从另一个问题的答案,我发现:"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 文件,添加所有文件并保持目录/文件结构完整。
我希望这段经历可以帮助别人。