Как правильно собрать действительный файл xlsx из его внутренних подкомпонентов?

Я пытаюсь создать файл xlsx программно на iOS. Поскольку внутренние данные файлов xlsx в основном хранятся в отдельных файлах xml, я попытался воссоздать структуру xlsx со всеми ее файлами и подкаталогами, сжать их в zip файл и установить расширение на xlsx. Я использую парсер/писатель GDataXML для создания всех необходимых XML файлов. Однако файл, который я получаю, не может быть открыт как файл xlsx. Даже если я разорву все данные из действительного файла xlsx, создайте все xml файлы вручную, скопировав данные из исходных xml файлов и сжимайте их вручную, я не могу воссоздать действительный файл xlsx.

Вопросы:

  • xlsx действительно просто архив, содержащий xml файлы?
  • Как создать действительный файл xlsx программно, если я не могу просто сжать xml файлы в zip файл и установить его расширение на xlsx?

Ответ 1

В ответ на ваши вопросы:

  1. XLSX - это просто набор XML файлов в zip-контейнере. Нет другой магии.
  2. Если вы распакуете/разархивируете действительные файлы 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 - единственный эффективный формат сжатия.