Export Excel mis en forme — totaux vivants et formats conservés
Formatted Excel XLSX Export for Odoo list views — export any Odoo list to a real workbook: typed dates, currency formats, frozen header, autofilter and a totals row written as live SUBTOTAL formulas that recalculate when you filter in Excel. Reusable export templates per model, added to the list Act
Captures d'écran
-
Export Excel mis en forme — totaux vivants et formats conservés — capture 1 -
Export Excel mis en forme — totaux vivants et formats conservés — capture 2 -
Export Excel mis en forme — totaux vivants et formats conservés — capture 3 -
Export Excel mis en forme — totaux vivants et formats conservés — capture 4 -
Export Excel mis en forme — totaux vivants et formats conservés — capture 5
Un classeur, pas un CSV déguisé
Exportez n'importe quelle liste Odoo vers un classeur réellement mis en forme : dates typées, formats monétaires, en-tête figé, filtre automatique — et une ligne de totaux écrite en formules SUBTOTAL, qui se recalculent quand vous filtrez dans Excel. Odoo 20 Community.
Ce module n'émet aucun appel sortant. Tout se passe dans votre serveur : rien ne part vers un service tiers, aucune clé à obtenir, aucun compte à créer. C'est pourquoi il fonctionne aussi bien sur Odoo Online, où les appels sortants sont interdits, que sur Odoo.sh et On Premise.
| Odoo 20 Community — On Premise | ✔ |
| Odoo.sh | ✔ |
| Odoo Online (SaaS) — aucun appel sortant n'est émis | ✔ |
Le constat
L'export natif d'Odoo écrit des valeurs. Le fichier s'ouvre dans Excel, et c'est à peu près tout ce qu'on peut en dire : la date y est un texte que le tableur ne sait ni trier ni soustraire, le montant un nombre sans devise, le booléen un « True », et le total qui s'affichait au bas de la vue liste a purement disparu. Celui qui reçoit le fichier refait la mise en forme à la main — et la refait encore au prochain export. C'est un travail qui revient toutes les semaines et que personne ne compte.
SUBTOTAL, et non SUM
La ligne de totaux n'est pas une valeur calculée au moment de l'export : c'est une formule. Et le choix de la fonction est le cœur du produit.
Une valeur figée ment
Un total calculé en Python et écrit dans la cellule est juste une seconde, puis faux dès le premier filtre. Un total faux est pire qu'un total absent : il se lit comme un résultat.
SUM ment aussi
SUM additionne toute la plage, y compris les lignes masquées par le filtre. Il donne donc la même réponse avant et après filtrage — silencieusement fausse.
SUBTOTAL suit le filtre
SUBTOTAL ignore les lignes masquées. Filtrez sur un client dans Excel : le total se recalcule pour ce client seul. C'est ce que le module vous vend.
| Total demandé | Formule écrite | Ce qu'elle calcule |
|---|---|---|
| Somme | =SUBTOTAL(9;B2:B15) | l'addition des seules lignes visibles |
| Moyenne | =SUBTOTAL(1;B2:B15) | la moyenne des lignes visibles |
| Nombre de valeurs | =SUBTOTAL(3;B2:B15) | le compte des cellules non vides visibles |
Une somme sur une colonne de texte est refusée à l'enregistrement, pas à l'export. Excel rendrait zéro, et l'utilisateur découvrirait le problème trois semaines plus tard devant un classeur qui ment. La garde est posée là où elle s'apprend.
Un modèle d'export qui se retient
Paramètres → Classeurs Excel → Modèles de classeur. Trois modèles, chacun rattaché à un modèle Odoo : Pays et indicatifs téléphoniques sur Pays, Devises en service sur Devise, Annuaire des clients sur Contact. La colonne Dans le menu Action montre l'interrupteur vert sur les deux modèles posés dans le menu, et gris sur « Devises en service », défini mais volontairement non posé. La colonne Ligne de totaux est cochée sur les trois.
Les colonnes, leur ordre et leurs totaux
La fiche du modèle Annuaire des clients. À gauche la portée — modèle Odoo Contact, nom technique res.partner, fichier annuaire_clients. À droite les trois réglages de mise en forme, tous cochés : Figer la ligne d'en-tête, Filtre automatique, Ligne de totaux. En bas, l'onglet Colonnes : quatre lignes réordonnables par glisser-déposer, chacune avec son champ, son type lu automatiquement (caractère, many2one, nombre flottant), le titre écrit dans le classeur, le total et la largeur. La colonne Nom porte un Nombre de valeurs, la colonne Latitude une Somme, les deux autres aucun total.
L'export est là où vous regardez vos lignes
Un bouton Poser dans le menu Action suffit : le modèle s'accroche lui-même à la liste correspondante. L'acheteur n'apprend pas un menu technique — il retrouve son export dans le menu Actions, là où il travaille déjà.
La liste des contacts, 14 sélectionné(s), menu Actions ouvert. Sous les entrées natives d'Odoo — Exporter, Dupliquer, Archiver, Désarchiver, Supprimer, Fusionner — figure « Exporter en Excel — Annuaire des clients », posée par le modèle. Elle porte le nom du modèle, de sorte que plusieurs exports du même type d'enregistrement restent distinguables.
Le classeur, en un clic
La fenêtre Classeur produit rappelle le modèle retenu et le nombre de lignes — ici 14, exactement la sélection — puis rend annuaire_clients.xlsx, prêt au téléchargement. Aucune ligne cochée ? Le module refuse et le dit : il n'exporte jamais « tout » à votre insu.
Chaque colonne a le type qu'elle doit avoir
| Champ Odoo | Ce qui est écrit dans la cellule | Pourquoi |
|---|---|---|
| Date, date-heure | une vraie date, jj/mm/aaaa | Excel sait la trier et la soustraire ; un texte, non |
| Monétaire | un nombre au format de sa devise | un montant sans devise n'est qu'un nombre |
| Booléen | « Oui » ou « Non » | « True » n'est pas une réponse lisible |
| Many2one vide | une cellule vide | jamais « False », la faute la plus visible d'un export fait à la main |
| Sélection | le libellé | « Facture », et non invoice |
| Nombre valant zéro | un zéro | confondre zéro et vide fait mentir la colonne sur les lignes les plus intéressantes |
Ce qui ne peut pas être juste est dit
Une colonne monétaire n'a qu'un format de cellule ; une liste multidevise en a plusieurs. Il n'existe aucune façon d'avoir raison — il en existe une d'être honnête. Le classeur garde tous les montants exacts, applique le format de la devise retenue, et affiche l'avertissement à l'écran avant le téléchargement : vous êtes prévenu avant d'envoyer le fichier à votre comptable, et non après. L'avertissement ne se déclenche que lorsqu'il y a réellement plusieurs devises : une alerte permanente est une alerte qu'on cesse de lire.
Le module s'installe même sans xlsxwriter
Quand la bibliothèque xlsxwriter manque, trois conduites sont possibles et deux sont malhonnêtes. Refuser l'installation punit l'acheteur pour un manque qu'il peut combler en une minute. Livrer un CSV en silence lui fait croire qu'il a son classeur. Seule la troisième se défend : produire le CSV et l'annoncer — dans un bandeau à l'écran, avant l'export. C'est pourquoi la bibliothèque n'est délibérément pas déclarée dans external_dependencies, une déclaration qui bloquerait l'installation. Un test vérifie qu'elle n'y est pas, pour que personne ne l'y remette par réflexe.
Éprouvé, et éprouvé contre soi-même
37 tests, aucun échec. Les assertions décisives lisent le XML du classeur décompressé à la main : un XLSX est une archive ZIP, et une formule y apparaît en clair. Aucune bibliothèque tierce ne peut donc neutraliser le test qui garde la promesse centrale.
Chaque règle a ensuite été cassée volontairement pour vérifier que les tests tombent : SUBTOTAL remplacé par SUM (4 tests tombés), la formule remplacée par une valeur figée (4), le zéro confondu avec le vide (1), l'avertissement de devises supprimé (1), le repli CSV rendu silencieux (2). La première version du test sur le zéro ne tombait pas — elle cherchait une valeur dans toute la feuille et trouvait l'indice de chaîne partagée de l'en-tête. Elle a été réécrite pour viser la cellule et vérifier son type. Un test qui ne tombe pas quand on casse sa règle ne garde rien.
L’application en mouvement
Le module en marche, enregistré dans le vrai client Odoo 19 : les modèles de classeur, le modèle « Annuaire des clients » (fiche), le modèle « Devises en service » (fiche) puis les modèles de classeur. Ce n’est pas un montage — ce sont les trames du navigateur sur le module livré, pris sur sa propre base.
Vidéo MP4 — 225 ko, 1280 px, 3.3 s, 4 écrans. Une amorce animée est aussi livrée en GIF (380 ko, 560 px) pour les contextes qui n’affichent pas la balise vidéo.
Ce que le module ne fait pas
Il n'est pas un tableur dans Odoo : le tableur natif d'Odoo est une fonctionnalité Enterprise, et ce module ne la reproduit pas. Il ne fait pas de tableau croisé dynamique, ne réimporte pas les classeurs modifiés, ne touche pas aux rapports PDF et n'envoie rien nulle part. Il exporte une liste, bien.
DYONYSOS — welcome@dyonysos.fr
Odoo 20 Community · licence OPL-1 · guide utilisateur et documentation technique fournis avec le module.
Ce que l'application ne fait pas
- Il n'est pas un tableur dans Odoo : le tableur natif d'Odoo est une fonctionnalité Enterprise , et ce module ne la reproduit pas. Il ne fait pas de tableau croisé dynamique, ne réimporte pas les classeurs modifiés, ne touche pas aux rapports PDF et n'envoie rien nulle part. Il exporte une liste, bie
- DYONYSOS — welcome@dyonysos.fr Odoo 20 Community · licence OPL-1 · guide utilisateur et documentation technique fournis avec le module.
Applications du magasin nécessaires
Aucune.
Modules Odoo Community utilisés
base
| Série | Version | État | Publiée le |
|---|---|---|---|
| 20.0 | 20.0.1.0.0 | Disponible | 02/10/2026 |
| 19.0 | 19.0.1.0.1 | Disponible |
Fiche générée depuis le code de l'éditeur (dépôt privé, branche 20.0) : le code source n'est pas publié.
Contrôle automatique du magasin (distinct de l'éditeur), appliqué à toutes les applications. Conforme.
| Contrôle | Résultat | Effet si absent |
|---|---|---|
| Manifeste lisible sans exécution | conforme | bloquant |
| Licence reconnue (OPL-1) | conforme | bloquant |
| Aucune dépendance vers Odoo Enterprise | conforme | bloquant |
| Aucun import de code Enterprise | conforme | bloquant |
| Aucun en-tête de licence Enterprise | conforme | bloquant |
| Icône static/description/icon.png | conforme | déclasse |
| Description (static/description/index.html ou README) | conforme | déclasse |
| Tests automatisés (tests/test_*.py) | conforme | déclasse |
| Traduction française (i18n/fr.po) | conforme | info |
| Section « Ce que le module ne fait pas » | conforme | info |
| Titre de 70 caractères au plus (63 actuellement) | conforme | info |
| Résumé en français | absent | info |
Guide d'utilisation — Export Excel mis en forme
Ce guide s'adresse à celui qui utilisera le module au quotidien, et à celui qui le paramètre. Il ne demande aucune connaissance technique.
1. Ce que le module change
Odoo sait déjà exporter une liste. Le fichier obtenu s'ouvre dans Excel, mais il ne contient que des valeurs brutes : les dates sont du texte, les montants n'ont pas de devise, et le total qui s'affichait au bas de votre liste a disparu.
Avec ce module, l'export produit un classeur :
- les dates sont de vraies dates, qu'Excel sait trier et soustraire ;
- les montants portent le symbole de leur devise ;
- l'en-tête est figé et porte les menus de filtre ;
- une ligne de totaux se trouve sous vos données — et ces totaux se recalculent quand vous filtrez dans Excel.
Ce dernier point est le plus important. Nous y revenons au chapitre 6.
2. Où se trouvent les écrans
Tout le paramétrage tient dans un seul menu :
Paramètres → Classeurs Excel → Modèles de classeur
L'export, lui, ne se fait pas depuis ce menu. Il se fait depuis la liste que vous voulez exporter, dans le menu Actions. C'est le chapitre 5.
3. Créer un modèle d'export
Un « modèle d'export » mémorise votre choix de colonnes pour un type d'enregistrement donné. Vous le définissez une fois ; vous vous en servez chaque mois.
3.1 Ouvrir la fiche
Allez dans Paramètres → Classeurs Excel → Modèles de classeur, puis cliquez sur Nouveau.
3.2 Remplir la portée
| Champ | Ce qu'il attend |
|---|---|
| Nom du modèle | un nom parlant, qui apparaîtra dans le menu Actions. Par exemple « Annuaire des clients » |
| Modèle Odoo | le type d'enregistrement à exporter : Contact, Commande, Facture… |
| Nom technique | rempli tout seul. C'est une information, pas une saisie |
| Nom du fichier | le nom du fichier téléchargé, sans extension. Laissé vide, le nom du modèle Odoo est repris |
3.3 Régler la mise en forme
Trois cases, toutes cochées par défaut :
| Réglage | Effet |
|---|---|
| Figer la ligne d'en-tête | l'en-tête reste visible quand on fait défiler le classeur |
| Filtre automatique | pose les menus de filtre d'Excel sur l'en-tête. C'est lui qui rend les totaux vivants — voir chapitre 6 |
| Ligne de totaux | ajoute la ligne de totaux sous les données |
Décocher « Filtre automatique » n'empêche pas les totaux de fonctionner, mais vous prive de ce qui les rend intéressants. Laissez-le coché.
4. Choisir les colonnes
L'onglet Colonnes est le cœur du paramétrage.
4.1 Ajouter une colonne
Cliquez sur Ajouter une ligne, puis choisissez le champ. La liste proposée ne contient que les champs du modèle Odoo retenu plus haut.
| Colonne du tableau | À quoi elle sert |
|---|---|
| ⠿ (poignée) | glissez-déposez pour changer l'ordre des colonnes dans le classeur |
| Champ | le champ Odoo à exporter |
| Type | rempli tout seul. Il vous dit si un total est possible |
| Titre de la colonne | l'en-tête écrit dans le classeur. Laissé vide, le libellé du champ est repris |
| Total | Aucun, Somme, Moyenne ou Nombre de valeurs |
| Largeur | en caractères. Laissez 0 : la largeur s'ajuste alors sur le contenu |
4.2 Les totaux possibles
| Total | Sur quels champs | Ce qu'il donne |
|---|---|---|
| Aucun | tous | pas de total pour cette colonne |
| Somme | nombres uniquement | l'addition des lignes visibles |
| Moyenne | nombres uniquement | la moyenne des lignes visibles |
| Nombre de valeurs | tous | le compte des cellules non vides visibles |
Si vous demandez une Somme ou une Moyenne sur une colonne de texte, Odoo refuse l'enregistrement et vous explique pourquoi : Excel rendrait zéro, et un zéro faux se lit comme un résultat. Utilisez Nombre de valeurs pour compter des lignes de texte.
4.3 Les champs qu'on ne peut pas exporter
Les pièces jointes (champs « binaire ») et les champs techniques JSON sont refusés : ils n'ont pas de rendu tabulaire honnête. Le message vous le dit au moment où vous les choisissez.
5. Poser l'export dans le menu Actions
C'est le geste qui rend le modèle utilisable au quotidien.
Sur la fiche du modèle, cliquez sur Poser dans le menu Action (bouton violet, en haut à gauche).
À partir de là, ouvrez la liste correspondante — par exemple Contacts —, cochez les lignes voulues, puis ouvrez le menu Actions : une nouvelle entrée y figure, nommée « Exporter en Excel — le nom de votre modèle ».
5.1 Produire le classeur
- Cochez les lignes à exporter dans la liste. Vous pouvez cocher la case du haut pour tout prendre.
- Actions → Exporter en Excel — …
- Une fenêtre s'ouvre, rappelant le modèle retenu et le nombre de lignes.
- Cliquez sur Produire le classeur.
- Le fichier apparaît ; cliquez dessus pour le télécharger.
Aucune ligne cochée ? Le module refuse et vous le dit. Il n'exporte jamais « tout » à votre insu.
5.2 Retirer l'entrée du menu
Le bouton Retirer du menu Action enlève l'entrée sans supprimer le modèle. Les deux gestes sont distincts exprès : vous pouvez ranger un export saisonnier sans le perdre, et le remettre l'année suivante.
Si vous supprimez le modèle, son entrée de menu disparaît avec lui — une entrée orpheline pointerait dans le vide.
6. Ce que donne le classeur, ouvert dans Excel
Ouvrez le fichier téléchargé. Vous y trouverez :
Une ligne d'en-tête en gras sur fond bleu clair, bordée, figée : elle reste visible quand vous descendez dans les lignes.
Des menus de filtre sur chaque en-tête (les petites flèches).
Des colonnes correctement typées : les dates se trient comme des dates, les montants s'additionnent, les nombres sont alignés à droite.
Une ligne de totaux en gras, séparée par un trait, sous la dernière ligne.
6.1 L'essentiel : filtrez, et regardez le total
Cliquez sur la flèche de filtre d'une colonne — par exemple Pays — et ne gardez que « Belgique ».
Le total se recalcule sur les seules lignes belges.
C'est ce que le module vous vend. La cellule ne contient pas un nombre écrit une
fois pour toutes, mais une formule SUBTOTAL que le tableur recalcule à chaque
filtre. Un total figé aurait été juste au moment de l'export, puis faux dès votre
premier filtre — et rien ne vous aurait averti.
6.2 LibreOffice Calc
Le classeur s'ouvre de la même façon dans LibreOffice Calc, formules comprises.
SUBTOTAL y porte le nom SOUS.TOTAL en interface française, mais c'est la même
fonction et elle se comporte à l'identique.
7. Le cas des devises mélangées
Si une colonne monétaire contient des montants dans plusieurs devises, une seule ne peut pas être affichée correctement — une colonne Excel n'a qu'un format.
Le module ne choisit pas en silence. Il :
- garde tous les montants exacts, sans conversion ni arrondi ;
- applique le format de la première devise rencontrée ;
- affiche un avertissement à l'écran, avant que vous ne téléchargiez le fichier, vous disant combien de devises se mélangent et laquelle a été retenue.
Vous êtes donc prévenu avant d'envoyer le fichier à votre comptable, et non après.
Si ce mélange vous gêne, filtrez votre liste par devise avant d'exporter, ou créez un modèle d'export par devise.
8. Le bandeau « xlsxwriter absent »
Si vous voyez, en ouvrant l'assistant d'export, un bandeau orange disant que la
bibliothèque xlsxwriter est absente :
Ce n'est pas une panne. Le module reste installé et fonctionne. Seulement, il produira un fichier CSV au lieu d'un classeur : sans mise en forme, sans format de date ni de devise, et sans ligne de totaux.
Que faire
Cette bibliothèque fait partie de toute installation Odoo standard ; son absence signale une installation incomplète. Transmettez cette phrase à la personne qui administre votre serveur Odoo :
« Il manque la bibliothèque Python
xlsxwritersur le serveur. »
Elle l'installera en une commande. Le bandeau disparaîtra et les exports redeviendront des classeurs, sans rien reconfigurer de votre côté.
En attendant, vos exports fonctionnent — ils sont simplement moins riches, et le module vous le dit plutôt que de vous laisser le découvrir.
9. Qui peut faire quoi
| Vous êtes | Modèles d'export | Exporter |
|---|---|---|
| Utilisateur interne | vous les voyez, vous ne les modifiez pas | oui, sans restriction |
| Administrateur système | vous les créez et les modifiez | oui |
Un modèle d'export ajoute une entrée dans le menu Actions de tous les utilisateurs. C'est donc un réglage, confié à l'administrateur — pas une préférence personnelle.
10. Limites connues
Ce n'est pas un tableur dans Odoo. Le tableur intégré d'Odoo est une fonctionnalité de l'édition Enterprise ; ce module ne la remplace pas et ne prétend pas éditer des feuilles dans votre navigateur. Il exporte.
Pas de tableau croisé dynamique. Le classeur reproduit votre liste, colonne par colonne, pas une analyse croisée.
Pas de réimport. Un classeur modifié dans Excel ne remonte pas dans Odoo.
Pas de rapports PDF. Le module ne touche à aucun rapport imprimé existant.
11. Questions fréquentes
Puis-je avoir plusieurs exports différents pour le même type d'enregistrement ? Oui. Créez autant de modèles que vous voulez sur le même modèle Odoo, avec des noms différents — « Annuaire complet », « Annuaire commercial »… Chacun pose sa propre entrée dans le menu Actions. Deux modèles ne peuvent simplement pas porter le même nom sur le même modèle Odoo.
Pourquoi ma colonne est-elle trop étroite ? Laissez 0 dans la colonne Largeur : le module ajuste alors sur le contenu réel. Une largeur saisie est respectée telle quelle, même si elle coupe le texte.
Le total affiche zéro alors que ma colonne contient des nombres.
Vérifiez que la colonne est bien d'un type numérique dans Odoo. Un nombre stocké
comme texte reste du texte, et SUBTOTAL ne l'additionne pas.
Puis-je exporter des milliers de lignes ? Oui. Le classeur est construit en mémoire ; sur de très grands volumes, la production prend quelques secondes.
Le module envoie-t-il mes données quelque part ? Non. Il n'émet aucun appel sortant. Tout se passe dans votre serveur Odoo. C'est aussi pourquoi il fonctionne sur Odoo Online, où les appels sortants sont interdits.
Mon export contient des lignes que je n'avais pas cochées. Ce n'est pas possible : le module n'exporte que la sélection qui lui a été transmise. Vérifiez que vous n'aviez pas coché la case d'en-tête, qui sélectionne toute la page.
DYONYSOS — https://dyonysos.fr — welcome@dyonysos.fr
Avis des clients connectés. Un avis noté par client ; l'éditeur peut y répondre. Connectez-vous pour laisser un avis.
- Éditeur
- DYONYSOS
- contact@omnifloo.com
- Clients Omnifloo
- Support inclus selon votre formule : centre d'aide.