2013-03-03 10 views
6

Ich versuche, eine XLSX-Datei programmgesteuert mit Objective-C zu ändern.Welche Zipping-Bibliothek sollte ich verwenden, um eine gültige XLSX-Datei in Objective-C zu erstellen?

Bisher ändere ich nur die Daten auf einem der Blätter. Die Schritte, die ich nehme, sind wie folgt:

  • Kopieren Sie die XLSX zu Ordner Dokumente
  • Entpacken Sie die XLSX Behälter unter Beibehaltung der Verzeichnisstruktur
  • Parse das entsprechende Blatt XML-Datei (sheet2.xml in meinem Fall Datei)
  • einige Zeilen hinzufügen
  • die XML-Struktur Rewrite und es
  • Setzen sie die aktualisierte XML-Datei zurück in den XLSX Container
0 speichern

Die neue XLSX-Datei wird jedoch beschädigt. Ich benutze GDataXML für XML-Parsing/Schreiben und Objective-Zip zum Zippen/Entpacken.

Ich weiß, dass die XML-Datei, die ich erstellt habe, richtig ist, denn wenn ich manuell entzippen und die beschädigte XLSX-Datei erneut zip, wird es ohne Fehler geöffnet. Ich habe dies sowohl unter OS X (mit Unarchiver) als auch unter Windows (mit 7-Zip) gemacht.

Das Problem ist entweder mit der Objective-Zip-Bibliothek oder die Art, wie ich es verwende. Unten ist, wie ich das Zuziehen Methode implementieren:

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]; 

Ich habe auch versucht, die anderen compression Argumente ohne Glück verfügbar:

ZipCompressionLevelDefault 
ZipCompressionLevelBest 
ZipCompressionLevelFastest 

Meine Fragen sind:

  • Welche zippen Bibliothek sollte ich verwenden, um eine gültige XLSX-Datei programmgesteuert zu erstellen?
  • Wenn Objective-Zip geeignet ist, was ist falsch an meinem Code?

Von einem answer auf eine andere Frage, fand ich heraus, dass: „Das OOXML-Format legt, dass die einzige in der Verpackung erlaubt Komprimierungsverfahren DEFLATE ist“.

Ist es möglich, Objective-Zip zu zwingen, DEFLATE zu verwenden? Oder gibt es eine Open-Source-iOS-Zipping-Bibliothek, die DEFLATE verwendet?

+2

[miniz.c] (http://code.google.com/p/miniz/source/browse/trunk/miniz.c) implementiert den DEFLATE-Algorithmus. Ich bin mir aber nicht sicher, wie du dich mit schlichtem C fühlst. – CodaFi

+0

@CodaFi, Ich bin nicht sehr begeistert von der Verwendung von Plain C. Ich weiß jedoch, dass Objective-Zip-Bibliothek ZLib und MiniZip verwendet. – tolgamorf

+0

Objective-Zip implementiert die Deflation, aber ich glaube, dass es standardmäßig auf gzip angewendet wird, weshalb es Ihr Archiv "korrumpieren" könnte. Abgesehen davon, dass Sie den DEFLATE-Algorithmus lizensieren und Ihren eigenen schreiben sollten, könnten Sie einfach einen Wrapper dafür schreiben. Entschuldigung, es gibt nichts einfacheres, aber das sind Patente und dumme Standards (OOXML ist lächerlich) für dich. – CodaFi

Antwort

2

Ich fand die Antwort auf einige Recherchen und auch eine eins zu eins Korrespondenz mit Objective-Zip-Entwickler, flyingdolphinstudio.

Zunächst verwendet Objective-Zip DEFLATE als Standard-Komprimierungsmethode. Ich bestätigte das auch mit dem Entwickler, der mir sagte, dass die Verwendung ZipCompressionLevelDefault, ZipCompressionLevelFastest oder ZipCompressionLevelBest für das Argument compressionLevel: eine DEFLATE-Komprimierung garantieren wird.

Also, das Problem kommt von der mode: Argument, das ist ZipFileModeAppend in meinem Fall. Es scheint, dass MiniZip keine Methode hat, um die Dateien in einer Zip-Datei zu löschen und deshalb überschreibe ich die vorhandene Datei nicht, sondern füge eine neue hinzu.Um es klar zu sehen, wie mein xl/worksheets Ordner aussehen, nachdem es mit Objective-Zip Reißverschluss zumachen: worksheets folder

Also, der einzige Weg, einen gültigen XLSX Behälter zu schaffen, ist die Zip-Datei von Grund auf neu zu erstellen, indem Sie alle Dateien hinzufügen und die Verzeichnis-/Dateistruktur beibehalten.

Ich hoffe, diese Erfahrung würde jemandem helfen.

+0

Sie dürfen Ihre eigene Antwort akzeptieren, wissen Sie! – CodaFi

+0

Ja, ich glaube schon, aber es sagt mir, ich soll 24 Stunden warten :) – tolgamorf

+0

[zipzap] (http://github.com/pixelglow/zipzap) ist eine Objective-C-Bibliothek, die es erlaubt, Einträge in einer Zip-Datei zu löschen Datei, und macht die minimale Arbeit, um es zu aktualisieren, dh es wird nur nachfolgende Einträge und das zentrale Verzeichnis neu schreiben, um das Loch zu decken. –

Verwandte Themen