2012-06-18 10 views
32

Estoy tratando de 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.¿Cómo ensamblar correctamente un archivo xlsx válido desde sus subcomponentes internos?

Las preguntas son:

  • es xlsx realmente sólo un archivo que contiene los archivos XML?
  • ¿cómo puedo crear un archivo xlsx válido mediante programación si no puedo simplemente comprimir archivos xml en un archivo zip y establecer su extensión en xlsx?

Respuesta

40

En respuesta a sus preguntas:

  1. XLSX es sólo una colección de archivos XML en un recipiente postal. No hay otra magia.
  2. Si descomprime/descomprime un archivo XLSX válido y lo comprime/comprime y no puede leer la salida resultante, entonces el problema está en el software de compresión. 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 
     ... 

descomprimir regularmente archivos XLSX, hacer cambios menores para las pruebas y los re-Zip sin ningún problema.

Actualización: Lo importante es evitar comprimir el directorio padre. Aquí hay un ejemplo usando la utilidad zip sistema 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 
+1

7-zip versión 9.20 no está haciendo el trabajo. ¿Qué software usa que tenga los valores predeterminados correctos para xlsx de Office? –

+5

7-zip versión 9.20 hizo el truco, pero como dijo David, no haremos un zip con la carpeta principal. El zip (que se renombrará a xslx) debe tener directamente las carpetas _rels, docProps y xl. –

+2

He agregado un ejemplo. – jmcnamara

27

Si descomprimir un archivo xlsx en una carpeta y luego volver a comprimir de nuevo, el xlsx se corrompe/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, el archivo no es un xlsx válido. Debería ir dentro de la carpeta, seleccionar todos los contenidos y luego hacer clic con el botón derecho en & zip.

Cuestiones relacionadas