Как правильно собрать действительный файл xlsx из его внутренних подкомпонентов?
Я пытаюсь создать файл xlsx программно на iOS. Поскольку внутренние данные файлов xlsx в основном хранятся в отдельных файлах xml, я попытался воссоздать структуру xlsx со всеми ее файлами и подкаталогами, сжать их в zip файл и установить расширение на xlsx. Я использую парсер/писатель GDataXML для создания всех необходимых XML файлов. Однако файл, который я получаю, не может быть открыт как файл xlsx. Даже если я разорву все данные из действительного файла xlsx, создайте все xml файлы вручную, скопировав данные из исходных xml файлов и сжимайте их вручную, я не могу воссоздать действительный файл xlsx.
Вопросы:
- xlsx действительно просто архив, содержащий xml файлы?
- Как создать действительный файл xlsx программно, если я не могу просто сжать xml файлы в zip файл и установить его расширение на xlsx?
Ответы
Ответ 1
В ответ на ваши вопросы:
- XLSX - это просто набор XML файлов в zip-контейнере. Нет другой магии.
- Если вы распакуете/разархивируете действительные файлы XLSX, а затем повторно сожмете/заархивируете его, и вы не сможете прочитать полученный результат, тогда проблема в программном обеспечении для архивирования или файлах, которые вы распаковали. Попробуйте использовать другую библиотеку/утилиту или проверьте используемый по умолчанию тип и уровни сжатия и попробуйте сопоставить его с тем, что использует Excel. Или проверьте zip файл, чтобы убедиться, что структура каталогов была сохранена.
Пример содержимого файла 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
...
Я регулярно разархивирую файлы XLSX, вносю незначительные изменения для тестирования и перезаписываю их без проблем.
Обновление: важно не архивировать родительский каталог. Вот пример использования системной утилиты zip
в Linux или 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
Ответ 2
Если я распакую файл xlsx в папку, а затем снова скомпоную его, xlsx станет поврежденным/не распознанным. В моем случае причина в том, что мой zip-инструмент использует имя папки в качестве первого уровня для относительного пути каждого файла внутри zip.
Я решил проблему, создав пустой почтовый файл ВСТАВЛЯЙ папку с содержимым xlsx, а затем добавив к ней все файлы и папки.
На самом деле, если вы попытаетесь застегнуть папку самой, файл не является допустимым xlsx. Вам лучше пойти в папку, выбрать все содержимое, а затем щелкнуть правой кнопкой мыши и закрепить zip.
Ответ 3
Я использовал WinZip 15.5, чтобы разархивировать файлы xlsx xml. Различные типы сжатия давали разные результаты.
Примечание. Исходный размер файла составлял 555 КБ.
- .Zip: новый размер файла 3279 КБ (!). Excel можно открыть.
- .Zipx: новый размер файла 341 КБ. Excel не открывается.
- Zip SuperFast: новый размер файла 606 КБ. Excel можно открыть.
- Zip Enh. Deflate: новый размер файла 429 КБ. Excel не открывается.
- Zipx bzip2: новый размер файла 333 КБ. Excel не открывается.
- Zipx LZMA: новый размер файла 328 КБ. Excel не открывается.
- Zipx PPMd: новый размер файла 317 КБ. Excel не открывается.
Вывод: Zip SuperFast - единственный эффективный формат сжатия.