Ios 我应该使用哪个压缩库在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文件时

我正在尝试使用Objective-C以编程方式修改XLSX文件

到目前为止,我只修改了其中一张表上的数据。我采取的步骤如下:

  • 将XLSX文件复制到Documents文件夹
  • 解压XLSX容器,保留目录结构
  • 解析相应的工作表XML文件(在我的示例中为sheet2.XML)
  • 添加一些行
  • 重写XML结构并保存它
  • 将更新后的XML文件放回XLSX容器中
但是,新的XLSX文件已损坏。我正在使用XML解析/编写和压缩/解压

我知道我创建的XML文件是正确的,因为当我手动解压和重新压缩损坏的XLSX文件时,它会毫无错误地打开。我已经在OSX(使用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];
我还尝试了其他压缩级别的参数,但没有成功:

ZipCompressionLevelDefault
ZipCompressionLevelBest
ZipCompressionLevelFastest
我的问题是:

  • 我应该使用哪个压缩库以编程方式创建有效的XLSX文件
  • 如果Objective Zip适用,我的代码有什么问题
从一个问题到另一个问题,我发现:“OOXML格式规定包中唯一允许的压缩方法是DEFLATE”


是否可以强制目标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。