Ios 我应该使用哪个压缩库在Objective-C中正确组装有效的XLSX文件?
我正在尝试使用Objective-C以编程方式修改XLSX文件 到目前为止,我只修改了其中一张表上的数据。我采取的步骤如下:Ios 我应该使用哪个压缩库在Objective-C中正确组装有效的XLSX文件?,ios,objective-c,xml,zip,xlsx,Ios,Objective C,Xml,Zip,Xlsx,我正在尝试使用Objective-C以编程方式修改XLSX文件 到目前为止,我只修改了其中一张表上的数据。我采取的步骤如下: 将XLSX文件复制到Documents文件夹 解压XLSX容器,保留目录结构 解析相应的工作表XML文件(在我的示例中为sheet2.XML) 添加一些行 重写XML结构并保存它 将更新后的XML文件放回XLSX容器中 但是,新的XLSX文件已损坏。我正在使用XML解析/编写和压缩/解压 我知道我创建的XML文件是正确的,因为当我手动解压和重新压缩损坏的XLSX文件时
- 将XLSX文件复制到Documents文件夹
- 解压XLSX容器,保留目录结构
- 解析相应的工作表XML文件(在我的示例中为sheet2.XML)
- 添加一些行
- 重写XML结构并保存它
- 将更新后的XML文件放回XLSX容器中
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];
我还尝试了其他压缩级别的参数,但没有成功:
ZipCompressionLevelDefault
ZipCompressionLevelBest
ZipCompressionLevelFastest
我的问题是:
- 我应该使用哪个压缩库以编程方式创建有效的XLSX文件
- 如果Objective Zip适用,我的代码有什么问题
是否可以强制目标Zip使用DEFLATE?或者是否有使用DEFLATE的开源iOS压缩库?我在做了一些研究并与Objective Zip的开发人员进行了一对一的通信后找到了答案 首先,Objective Zip使用DEFLATE作为默认压缩方法。我还向开发人员证实了这一点,开发人员告诉我,对于参数
压缩级别:
使用ZipCompressionLevelDefault
、zipcompressionlevelfaster
或ZipCompressionLevelBest
,将保证压缩效果
因此,问题来自模式:
参数,在我的例子中是ZipFileModeAppend
。MiniZip似乎没有删除zip文件中文件的方法,这就是为什么我没有覆盖现有文件,而是添加一个新文件。为了更清楚地说明这一点,请查看我的xl/worksheets
文件夹在使用Objective Zip压缩后的外观:
因此,创建有效XLSX容器的唯一方法是从头开始创建zip文件,方法是添加所有文件并保持目录/文件结构完整
我希望这段经历能帮助一些人。实现了DEFLATE算法。我不确定您对纯C的感觉。@CodaFi,我对使用纯C不是很热情。但是,我知道Objective-Zip库使用ZLib和MiniZip。Objective-Zip实现了通缩,但我相信它默认为gzip,这可能是它“破坏”您的存档的原因。除了许可DEFLATE算法和编写自己的算法之外,您还可以编写一个包装器。很抱歉,没有什么比这更容易的了,但这是专利和愚蠢的标准(OOXML是荒谬的)。@CodaFi,我继续研究了Objective Zip的实现代码,并从那里到MiniZip和Zlib研究了压缩方法。默认方法是DEFLATE。还有一个问题,我正准备解决,很快就会发布。是的,我相信是这样,但它告诉我要等24小时:)是一个Objective-C库,允许您删除zip文件中的条目,并且做了最少的工作来更新它,即它只会重写后续条目和中心目录以覆盖漏洞。@GlenLow谢谢你的建议,我快速浏览了一下,看起来很有希望。我可能会在将来有时间的时候迁移到zipzap。