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
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?
[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
@CodaFi, Ich bin nicht sehr begeistert von der Verwendung von Plain C. Ich weiß jedoch, dass Objective-Zip-Bibliothek ZLib und MiniZip verwendet. – tolgamorf
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