2013-03-03 9 views
6

Sto provando a modificare un file XLSX a livello di codice usando Objective-C.Quale libreria zipping dovrei usare per assemblare correttamente un file XLSX valido in Objective-C?

Finora, sto solo modificando i dati su uno dei fogli. I passi che sto prendendo sono le seguenti:

  • Copiare il file XLSX alla cartella Documenti
  • Unzip il contenitore XLSX con mantenendo la struttura delle directory
  • analizzare il file XML corrispondente foglio (sheet2.xml nel mio caso)
  • aggiungere alcune righe
  • riscrivere la struttura XML e salvarlo
  • Inserire il file XML aggiornato nel contenitore XLSX

Tuttavia, il nuovo file XLSX viene danneggiato. Sto usando GDataXML per l'analisi/scrittura XML e Objective-Zip per zippare/decomprimere.

So che il file XML che ho creato è corretto, perché quando decomprimo manualmente e re-zip il file XLSX corrotto, si apre senza errori. Ho fatto questo su entrambi OS X (usando Unarchiver) e Windows (usando 7-Zip).

Il problema riguarda la libreria Objective-Zip o il modo in cui la utilizzo. Qui di seguito è come ho implementare il metodo zippare:

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

Ho provato anche gli altri CompressionLevel argomenti disponibili senza fortuna:

ZipCompressionLevelDefault 
ZipCompressionLevelBest 
ZipCompressionLevelFastest 

Le mie domande sono:

  • quale libreria zippare dovrei usare per creare un file XLSX valido a livello di programmazione?
  • Se Objective-Zip è adatto, cosa c'è di sbagliato nel mio codice?

Dal answer a un'altra domanda, ho scoperto che: "Il formato OOXML impone che l'unico metodo di compressione consentito nel pacchetto è DEFLATE".

È possibile forzare Objective-Zip per utilizzare DEFLATE? O esiste una libreria zipping iOS open source che utilizza DEFLATE?

+2

[miniz.c] (http://code.google.com/p/miniz/source/browse/trunk/miniz.c) implementa l'algoritmo DEFLATE. Non sono sicuro di come ti senti per C semplice. – CodaFi

+0

@CodaFi, non sono molto entusiasta dell'utilizzo di C. semplice. Tuttavia, so che la libreria Objective-Zip utilizza ZLib e MiniZip. – tolgamorf

+0

Objective-Zip implementa la deflazione, ma credo che per impostazione predefinita gzip, che potrebbe essere il motivo per cui "corrompe" il tuo archivio. A corto di licenze per l'algoritmo DEFLATE e per scrivere il tuo, potresti semplicemente scrivere un wrapper attorno a questo. Spiacente, non c'è niente di più semplice, ma questo è brevetti e standard stupidi (OOXML è ridicolo) per te. – CodaFi

risposta

2

Ho trovato la risposta dopo aver fatto qualche ricerca e avendo anche una corrispondenza uno a uno con lo sviluppatore di Objective-Zip, flyingdolphinstudio.

Prima di tutto, Objective-Zip utilizza DEFLATE come metodo di compressione predefinito. Ho anche confermato questo con lo sviluppatore, che mi ha detto che l'utilizzo di ZipCompressionLevelDefault, ZipCompressionLevelFastest o ZipCompressionLevelBest per l'argomento compressionLevel: garantisce una compressione di DEFLATE.

Quindi, il problema viene dall'argomento mode:, che è ZipFileModeAppend nel mio caso. Sembra che MiniZip non abbia un metodo per cancellare i file all'interno di un file zip ed è per questo che non sto sovrascrivendo il file esistente, ma aggiungendone uno nuovo.Per renderlo più chiaro, dare un'occhiata a come la mia cartella xl/worksheets simile dopo zippare usando Objective-Zip: worksheets folder

Così, l'unico modo per creare un contenitore XLSX valida è quella di creare il file zip da zero, aggiungendo tutti i file e mantenendo intatta la struttura della directory/dei file.

Spero che questa esperienza possa aiutare qualcuno a uscire.

+0

Puoi accettare la tua risposta, lo sai! – CodaFi

+0

Sì, credo di sì, ma mi dice di attendere 24 ore :) – tolgamorf

+0

[zipzap] (http://github.com/pixelglow/zipzap) è una libreria Objective-C che consente di eliminare le voci all'interno di un file zip file, e fa il lavoro minimo per aggiornarlo, vale a dire che riscriverà solo le voci successive e la directory centrale per coprire il buco. –

Problemi correlati