¿Cómo ensamblar correctamente un archivo xlsx válido a partir de sus subcomponentes internos?

Intento crear un archivo xlsx programáticamente en iOS. Como los datos internos de los archivos xlsx se almacenan básicamente en archivos xml separados, traté de recrear la estructura xlsx con todos sus archivos y subdirectorios, comprimirlos en un archivo zip y establecer su extensión en xlsx. Uso el analizador / grabador GDataXML para crear todos los archivos xml necesarios. Sin embargo, el archivo que obtengo no se puede abrir como archivo xlsx. Incluso si elimino todos los datos de un archivo xlsx válido, creo todos los archivos xml manualmente al copiar datos de los archivos xml originales y comprimirlos manualmente, no puedo volver a crear un archivo xlsx válido.

Las preguntas son:

  • ¿es xlsx realmente solo un archivo que contiene archivos xml?
  • ¿Cómo puedo crear un archivo xlsx válido mediante progtwigción si no puedo simplemente comprimir archivos xml en un archivo zip y establecer su extensión en xlsx?

En respuesta a tus preguntas:

  1. XLSX es solo una colección de archivos XML en un contenedor zip. No hay otra magia.
  2. Si descomprime / descomprime un archivo XLSX válido y luego lo comprime / comprime y no puede leer la salida resultante, entonces el problema es con el software de compresión o los archivos que ha vuelto a cargar. Pruebe con una biblioteca / utilidad diferente o verifique el tipo de compresión predeterminado y los niveles que usa e intente hacer coincidir con lo que usa Excel. O verifique el archivo zip para asegurarse de que la estructura del directorio se mantuvo.

Ejemplo del contenido de un archivo 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 ... 

Descomprimo regularmente archivos XLSX, hago pequeños cambios para probarlos y vuelvo a comprimirlos sin problemas.

Actualización: Lo importante es evitar comprimir el directorio principal. Aquí hay un ejemplo usando la utilidad del sistema zip en Linux o 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 

Si descomprimo un archivo xlsx en una carpeta y luego lo vuelvo a comprimir, el xlsx se vuelve corrupto / no reconocido. En mi caso, la causa es que mi herramienta zip está usando el nombre de la carpeta como el primer nivel para la ruta relativa de cada archivo dentro del zip.

He resuelto el problema creando un archivo zip vacío DENTRO de la carpeta con el contenido xlsx y luego agregando todos los archivos y carpetas.

En realidad, si intenta comprimir la carpeta en sí, el archivo no es un xlsx válido. Debería ir dentro de la carpeta, seleccionar todos los contenidos y luego hacer clic derecho y zip.