web-dev-qa-db-fra.com

Comment assembler correctement un fichier xlsx valide à partir de ses sous-composants internes?

J'essaie de créer un fichier xlsx par programme sur iOS. Étant donné que les données internes des fichiers xlsx sont essentiellement stockées dans des fichiers xml séparés, j'ai essayé de recréer la structure xlsx avec tous ses fichiers et sous-répertoires, les compresser dans un fichier Zip et définir son extension sur xlsx. J'utilise l'analyseur/enregistreur GDataXML pour créer tous les fichiers xml nécessaires. Cependant, le fichier que je reçois ne peut pas être ouvert en tant que fichier xlsx. Même si je rippe toutes les données d'un fichier xlsx valide, crée tous les fichiers xml manuellement en copiant les données des fichiers xml d'origine et les compresse manuellement, je ne peux pas recréer un fichier xlsx valide.

Les questions sont:

  • xlsx est-il vraiment juste une archive contenant des fichiers xml?
  • comment puis-je créer un fichier xlsx valide par programme si je ne peux pas simplement compresser des fichiers xml en fichier Zip et définir son extension sur xlsx?
43
ufw

En réponse à vos questions:

  1. XLSX est juste une collection de fichiers XML dans un conteneur Zip. Il n'y a pas d'autre magie.
  2. Si vous décompressez/décompressez un fichier XLSX valide, puis le recompressez/zippez et que vous ne pouvez pas lire la sortie résultante, le problème vient du logiciel de zippage ou des fichiers que vous avez recompressés. Essayez une autre bibliothèque/utilitaire ou vérifiez le type et les niveaux de compression par défaut qu'elle utilise et essayez de la faire correspondre à tout ce qu'Excel utilise. Ou vérifiez le fichier Zip pour vous assurer que la structure du répertoire a été maintenue.

Exemple du contenu d'un fichier 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
      ...

Je décompresse régulièrement les fichiers XLSX, j'apporte des modifications mineures aux tests et je les recompresse sans aucun problème.

Mise à jour: l'important est d'éviter de zipper le répertoire parent. Voici un exemple d'utilisation de l'utilitaire système Zip sous Linux ou 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
62
jmcnamara

Si je décompresse un fichier xlsx dans un dossier et que je le recompresse à nouveau, le xlsx devient corrompu/non reconnu. Dans mon cas, la cause est que mon outil Zip utilise le nom du dossier comme premier niveau pour le chemin relatif de chaque fichier à l'intérieur du Zip.

J'ai résolu le problème en créant un fichier Zip vide À L'INTÉRIEUR du dossier avec le contenu xlsx, puis en y ajoutant tous les fichiers et dossiers.

En fait, si vous essayez de compresser le dossier lui-même, le fichier n'est pas un xlsx valide. Vous devriez plutôt aller à l'intérieur du dossier, sélectionner tout le contenu, puis cliquer avec le bouton droit sur & Zip.

31
David