En savoir plus

Ce qu'il y a dans un fichier Excel

Un .xlsx n'est pas un fichier mystere : c'est un .zip rempli de XML. On l'ouvre, on retrouve la feuille de donnees, et on la compare au bon vieux CSV.

Le grand secret : un .xlsx est un .zip deguise#

Quand tu travailles avec un fichier .csv, tu peux l'ouvrir dans un editeur de texte et tout lire : c'est du texte brut. Mais un fichier Excel .xlsx ? Ouvre-le dans un editeur de texte et tu n'obtiens que du charabia. Pourquoi ?

Parce qu'un .xlsx est en realite une archive .zip. A l'interieur, ce ne sont pas des donnees secretes : c'est un petit dossier rempli de fichiers XML (le format de balises vu en classe), plus quelques images et reglages. Microsoft a juste choisi de tout compresser ensemble et de mettre l'extension .xlsx au lieu de .zip.

A essayer toi-meme (3 etapes)
1. Prends un fichier echantillons.xlsx
2. Renomme-le en echantillons.zip
3. Decompresse-le (clic droit -> Extraire) : un dossier apparait, rempli de XML.

Voici exactement ce qu'on trouve en decompressant le vrai fichier releves-meteo.xlsx (celui que tu peux telecharger plus bas) :

releves-meteo/ ├─ [Content_Types].xml # la liste de ce que contient l'archive ├─ _rels/ # les relations entre les fichiers └─ xl/ # le coeur du classeur Excel ├─ workbook.xml # la liste des feuilles du classeur ├─ styles.xml # couleurs, polices, bordures ├─ sharedStrings.xml # tous les TEXTES, ranges une seule fois └─ worksheets/ └─ sheet1.xml # ★ ICI sont les donnees de la feuille

Le CSV ne contient que des donnees. Le XLSX, lui, transporte aussi les couleurs, les formules, les graphiques, plusieurs feuilles... Tout ca explique pourquoi il a besoin d'un dossier entier plutot que d'un seul fichier texte.

Ou sont les donnees ? Dans xl/worksheets/sheet1.xml#

La feuille qui contient tes chiffres s'appelle sheet1.xml. Si on enleve les longues lignes techniques du debut, voici le coeur du fichier - la partie <sheetData> :

<sheetData> <row r="1"> <c r="A1" t="s"><v>0</v></c> <c r="B1" t="s"><v>1</v></c> </row> <row r="2"> <c r="A2"><v>1.0</v></c> <c r="B2"><v>20.1</v></c> </row> <row r="3"> <c r="A3"><v>2.0</v></c> <c r="B3"><v>21.5</v></c> </row> </sheetData>

On decode les balises comme en classe :

BaliseSignification
<row r="2">une rangee, ici la rangee numero 2
<c r="B2">une cellule (cell), ici la case B2
<v>20.1</v>la valeur (value) rangee dans la cellule
t="s"l'attribut "type = string" : la valeur n'est pas un nombre, c'est un texte range ailleurs
Le detail malin : sharedStrings.xml
Regarde la rangee 1 : les cellules contiennent <v>0</v> et <v>1</v> avec t="s". Ce ne sont pas les nombres 0 et 1 ! Ce sont des numeros de tiroir. Les vrais textes sont ranges une seule fois dans un fichier a part, sharedStrings.xml :
<sst count="2" uniqueCount="2"> <si><t>jour</t></si> <!-- tiroir numero 0 --> <si><t>temperature</t></si> <!-- tiroir numero 1 --> </sst>

Donc la cellule A1 dit t="s" et <v>0</v> : "va chercher le tiroir 0", soit le texte jour. La cellule B1 pointe vers le tiroir 1, soit temperature. Excel fait ca pour ne pas reecrire mille fois le meme mot quand il se repete dans toute la feuille : il le range une seule fois et n'y met que des numeros. Astucieux pour economiser de la place.

Excel versus CSV : le meme tableau, deux philosophies#

Reprenons exactement les memes donnees - trois releves de temperature. A gauche, le format CSV ; a droite, tout ce qu'il a fallu zipper pour faire un XLSX equivalent.

CSV - un seul fichier texte
jour,temperature 1,20.1 2,21.5 3,19.8

42 octets Lisible tel quel dans n'importe quel editeur.

XLSX - un .zip de plusieurs XML
[Content_Types].xml _rels/.rels xl/workbook.xml xl/styles.xml xl/sharedStrings.xml xl/worksheets/sheet1.xml ... + relations

~5000 octets Illisible sans le decompresser d'abord.

CritereCSVXLSX (Excel)
NatureTexte brutArchive zip de fichiers XML
Lisible a l'oeil nuOui, directementNon, il faut le decompresser
Couleurs, polices, borduresImpossibleOui (dans styles.xml)
Formules de calculImpossibleOui
Plusieurs feuilles, graphiquesImpossibleOui
Taille pour de petites donneesMinusculePlus lourd (l'archive a un cout fixe)
Facile a lire en PythonTres facile (module csv)Demande une librairie (openpyxl, pandas)
La regle de poche
Si tes donnees sont un simple tableau de chiffres, le CSV est parfait : leger, durable, lisible partout, jamais demode. Si tu as besoin de mise en forme, de formules, de plusieurs feuilles, c'est le travail d'Excel. Et maintenant tu sais que, dessous, Excel ne fait que du XML zippe - exactement ce que tu apprends a lire en classe.

En Python, lire les deux ressemble a ceci :

# CSV : deja dans la librairie standard import csv with open("releves-meteo.csv", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) for rangee in lecteur: print(rangee["jour"], rangee["temperature"]) # XLSX : il faut une librairie en plus (openpyxl) from openpyxl import load_workbook classeur = load_workbook("releves-meteo.xlsx") feuille = classeur.active for rangeeCellules in feuille.iter_rows(values_only=True): print(rangeeCellules)

Visualiser le XML dans le navigateur#

Pas besoin d'un logiciel special pour regarder du XML : ton navigateur sait deja le faire. Glisse un fichier .xml directement dans un onglet (ou fais Fichier -> Ouvrir), et il l'affiche sous forme d'arbre repliable : tu peux ouvrir et fermer chaque balise pour explorer la structure.

Telecharge les vrais fichiers extraits du releves-meteo.xlsx et ouvre-les dans ton navigateur pour voir l'arbre toi-meme :

Voir l'arbre, c'est bien. Mais ce que tu veux vraiment, c'est reconstituer le tableau a partir du XML. C'est exactement ce que fait Excel quand il ouvre le fichier. Le decodeur ci-dessous le fait sous tes yeux : il lit sheet1.xml, va chercher les textes dans sharedStrings.xml, et rebatit la feuille. Modifie les valeurs et reclique pour experimenter.

Decodeur de feuille Excel

xl/worksheets/sheet1.xml
xl/sharedStrings.xml
cellule t="s" : texte cherche dans sharedStrings    cellule normale : nombre ecrit directement