6

Objective-C を使用してプログラムで XLSX ファイルを変更しようとしています。

これまでのところ、1 つのシートのデータのみを変更しています。私が取っている手順は次のとおりです。

  • XLSX ファイルを Documents フォルダーにコピーします。
  • ディレクトリ構造を保ったままXLSXコンテナを解凍
  • 対応するシート XML ファイル (私の場合は sheet2.xml) を解析します。
  • いくつかの行を追加
  • XML 構造を書き換えて保存する
  • 更新された XML ファイルを XLSX コンテナーに戻します。

ただし、新しい XLSX ファイルは破損します。XML の解析/書き込みにはGDataXMLを使用し、圧縮/解凍にはObjective-Zipを使用しています。

破損した XLSX ファイルを手動で解凍して再圧縮すると、エラーなしで開くので、作成した XML ファイルが適切であることはわかっています。OS X (Unarchiver を使用) と Windows (7-Zip を使用) の両方でこれを実行しました。

問題は、Objective-Zip ライブラリか、それを使用する方法にあります。以下は、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 ファイルを作成するには、どの zip ライブラリを使用すればよいですか?
  • Objective-Zip が適している場合、コードの何が問題になっていますか?

別の質問への回答から、「OOXML 形式では、パッケージで許可されている唯一の圧縮方法が DEFLATE であることが強制されている」ことがわかりました。

Objective-Zip に DEFLATE を強制的に使用させることは可能ですか? または、DEFLATE を使用するオープンソースの iOS 圧縮ライブラリはありますか?

4

1 に答える 1

2

いくつかの調査を行い、Objective-Zip の開発者であるFlyingdolphinstudioと 1 対 1 で連絡を取って、答えを見つけました。

まず、Objective-Zip はデフォルトの圧縮方法として DEFLATE を使用します。また、これを開発者に確認したところ、引数にZipCompressionLevelDefault,ZipCompressionLevelFastestまたはを使用すると、DEFLATE 圧縮が保証されるとのことでした。ZipCompressionLevelBestcompressionLevel:

つまり、問題は私の場合のmode:議論から来ています。ZipFileModeAppendMiniZip には zip ファイル内のファイルを削除する方法がないようです。そのため、既存のファイルを上書きするのではなく、新しいファイルを追加しています。より明確にするために、xl/worksheetsObjective-Zip を使用して圧縮した後、私のフォルダーがどのように見える かを見てみましょう。ワークシート フォルダ

したがって、有効な XLSX コンテナーを作成する唯一の方法は、すべてのファイルを追加し、ディレクトリ/ファイル構造をそのまま維持して、zip ファイルをゼロから作成することです。

この経験が誰かの役に立てば幸いです。

于 2013-03-04T22:09:42.867 に答える