2012-06-18 2 views
32

Ich versuche, eine xlsx-Datei programmgesteuert auf iOS zu erstellen. Da die internen Daten von xlsx-Dateien grundsätzlich in separaten XML-Dateien gespeichert sind, habe ich versucht, die xlsx-Struktur mit all ihren Dateien und Unterverzeichnissen neu zu erstellen, sie in eine Zip-Datei zu komprimieren und ihre Erweiterung auf xlsx zu setzen. Ich benutze GDataXML Parser/Writer für die Erstellung aller notwendigen XML-Dateien. Die Datei, die ich erhalte, kann jedoch nicht als xlsx-Datei geöffnet werden. Selbst wenn ich alle Daten aus einer gültigen xlsx-Datei rippe, alle XML-Dateien manuell erstelle, indem ich Daten aus den ursprünglichen xml-Dateien kopiere und sie manuell komprimiere, kann ich keine gültige xlsx-Datei neu erstellen.Wie ordne ich eine gültige xlsx-Datei aus ihren internen Unterkomponenten richtig zusammen?

Die Fragen sind:

  • ist xlsx wirklich nur ein Archiv XML-Dateien enthalten?
  • Wie erstelle ich eine gültige xlsx-Datei programmatisch, wenn ich nicht einfach xml-Dateien in zip-Datei komprimieren und seine Erweiterung auf xlsx setzen kann?

Antwort

40

In Antwort auf Ihre Fragen:

  1. XLSX ist nur eine Sammlung von XML-Dateien in einem Zip-Container. Es gibt keine andere Magie.
  2. Wenn Sie eine gültige XLSX-Datei dekomprimieren/entpacken und sie dann erneut komprimieren/zippen, und Sie die resultierende Ausgabe nicht lesen können, dann ist das Problem mit der Zipping-Software. Probieren Sie eine andere Bibliothek/ein anderes Dienstprogramm aus, oder prüfen Sie den Standardkomprimierungstyp und die verwendeten Ebenen und versuchen Sie, ihn mit dem von Excel verwendeten zu vergleichen. Oder überprüfen Sie die ZIP-Datei, um sicherzustellen, dass die Verzeichnisstruktur beibehalten wurde.

Beispiel für den Inhalt einer xlsx-Datei:

unzip -l example.xlsx 
Archive: example.xlsx 
    Length  Date Time Name 
-------- ---- ---- ---- 
     769 10-15-14 09:23 xl/worksheets/sheet1.xml 
     550 10-15-14 09:22 xl/workbook.xml 
     201 10-15-14 09:22 xl/sharedStrings.xml 
     ... 

ich entpacken regelmäßig Dateien XLSX, machen kleinere Änderungen für die Prüfung und Wieder zip sie ohne Problem.

Update: Wichtig ist, das Eltern-Verzeichnis nicht zu komprimieren. Hier ist ein Beispiel des zip System-Utility unter Linux oder O X:

# Unzip an xlsx file into a directory. 
unzip example.xlsx -d newdir 

# Make some valid changes to the files. 
cd newdir/ 
vi xl/worksheets/sheet1.xml 

# Rezip the files *FROM* the unzipped directory. 
# Note: you could also re-zip to the original file if required. 
find . -type f | xargs zip ../newfile.xlsx 

# Check the file looks okay. 
cd .. 
unzip -l newfile.xlsx 
xdg-open newfile.xlsx 
+1

7-Zip-Version 9.20 macht nicht den Job. Welche Software verwenden Sie, die die korrekten Standardwerte für Office xlsx hat? –

+5

7-zip-Version 9.20 hat den Trick gemacht, aber wie David sagte, wir machen keine Zip mit übergeordneten Ordner. Die Zip-Datei (die in xslx umbenannt wird) muss direkt die Ordner _rels, docProps und xl enthalten. –

+2

Ich habe ein Beispiel hinzugefügt. – jmcnamara

27

Wenn ich eine xlsx-Datei in einen Ordner entpacken und dann habe ich es recompress wieder, wird die xlsx beschädigt/nicht erkannt. In meinem Fall ist die Ursache, dass mein ZIP-Tool den Ordnernamen als erste Ebene für den relativen Pfad jeder Datei innerhalb der ZIP verwendet.

Ich habe das Problem gelöst, indem ich eine leere ZIP-Datei INNERHALB des Ordners mit dem xlsx-Inhalt erstellte und dann alle Dateien und Ordner dazu hinzufügte.

Eigentlich, wenn Sie versuchen, den Ordner selbst zu komprimieren, ist die Datei keine gültige xlsx. Sie sollten lieber in den Ordner gehen, den gesamten Inhalt auswählen und dann mit der rechten Maustaste auf & zip klicken.

Verwandte Themen