2012-06-18 8 views
32

Próbuję programowo utworzyć plik xlsx na iOS. Ponieważ wewnętrzne dane plików xlsx są zasadniczo przechowywane w osobnych plikach xml, próbowałem odtworzyć strukturę Xlsx wraz ze wszystkimi jej plikami i podkatalogami, skompresować je do pliku zip i ustawić jego rozszerzenie na xlsx. Używam parser/program piszący GDataXML do tworzenia wszystkich niezbędnych plików xml. Jednak pliku, który otrzymuję, nie można otworzyć jako pliku xlsx. Nawet jeśli wyrwę wszystkie dane z prawidłowego pliku xlsx, ręcznie utworzę wszystkie pliki xml, kopiując dane z oryginalnych plików xml i skompresuję je ręcznie, nie będę mógł odtworzyć prawidłowego pliku xlsx.Jak prawidłowo zmontować prawidłowy plik Xlsx z jego wewnętrznych składników podrzędnych?

Pytania są:

  • jest xlsx naprawdę tylko archiwum zawierające pliki xml?
  • Jak utworzyć programowy plik Xlsx, jeśli nie mogę po prostu skompresować plików xml do pliku zip i ustawić jego rozszerzenie na xlsx?

Odpowiedz

40

W odpowiedzi na pytania:

  1. XLSX jest po prostu zbiór plików XML w pojemniku zip. Nie ma innej magii.
  2. Po rozpakowaniu/rozpakowaniu poprawnych plików XLSX, a następnie ponownym skompresowaniu/rozpakowaniu i nie można odczytać wynikowego wyniku, a następnie problem z oprogramowaniem do zrzutu. Wypróbuj inną bibliotekę/narzędzie lub sprawdź domyślny typ kompresji i poziomy, których używa i spróbuj dopasować go do tego, co używa program Excel. Lub sprawdź plik zip, aby upewnić się, że struktura katalogów została zachowana.

Przykład zawartości pliku xlsx:

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 
     ... 

regularnie rozpakowania plików XLSX, dokonać drobnych zmian do testowania i ponownie spakować je bez problemu.

Aktualizacja: Ważną rzeczą jest uniknięcie skompresowania katalogu nadrzędnego. Oto przykład za pomocą narzędzia systemowego zip na Linux lub OS 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

Wersja 7-zip 9.20 nie wykonuje zadania. Jakie oprogramowanie używasz, które ma poprawne wartości domyślne dla xlsx pakietu Office? –

+5

Wersja 7-zip w wersji 9.20 rozwiązała problem, ale jak powiedział David, nie zrobimy zip z folderem nadrzędnym. Zip (który zostanie przemianowany na xslx) musi mieć bezpośrednio katalogi _rels, docProps i xl. –

+2

Dodałem przykład. – jmcnamara

27

Gdybym rozpakować plik XLSX do folderu, a potem rekompresji go znowu, xlsx zostanie uszkodzony/nie rozpoznany. W moim przypadku przyczyną jest to, że moje narzędzie zip używa nazwy folderu jako pierwszego poziomu dla względnej ścieżki każdego pliku wewnątrz zip.

Rozwiązałem problem, tworząc pusty plik zip WEWNĄTRZ folderu z zawartością xlsx, a następnie dodając do niego wszystkie pliki i foldery.

W rzeczywistości, jeśli spróbujesz skompresować sam folder, plik nie jest prawidłowym kodem Xlsx. Powinieneś raczej wejść do folderu, zaznaczyć całą zawartość, a następnie kliknąć prawym przyciskiem myszy na zip &.

Powiązane problemy