Migrer vers Odoo depuis Excel/CSV : ordre, ID et pièges
Migrez vers Odoo depuis Excel ou CSV sans doublons : ID externes, ordre d’import, relations, dates et limites des imports irréversibles.
Long Nguyen
Développeur fullstack · Ingénieur IA · Chercheur
Comment migrer vers Odoo depuis Excel ou CSV : réponse courte
L’outil d’import d’Odoo accepte les fichiers .xlsx et .csv pour tout objet métier, notamment les contacts, les produits, les écritures comptables et les commandes. Le téléversement est la partie la plus simple. La réussite de la migration dépend de trois décisions prises dans le tableur, avant même d’ouvrir Odoo :
- Un onglet par modèle Odoo. Les clients, les produits et les lignes de commande sont importés séparément, dans des fichiers distincts.
- Un ID externe stable pour chaque ligne. C’est ce qui permet de réimporter un fichier corrigé sans créer de doublons.
- Des relations référencées, avec les parents en premier. Un produit ne peut pointer que vers une catégorie qui existe déjà dans Odoo.
Les imports sont définitifs. La documentation d’Odoo précise qu’ils ne peuvent pas être annulés. Tout ce qui suit vise donc à obtenir un résultat correct lors du test, et non après l’intégration des données.
À propos de la version : Odoo 20 est sorti en septembre 2026, selon la page des notes de version d’Odoo. Ce guide a été vérifié par rapport à la documentation 19.0. Les mécanismes liés aux ID externes et à la réimportation sont documentés de la même manière depuis la version 14.0 au moins, mais vérifiez les intitulés des menus dans votre propre version au moyen d’un test avant de vous y fier.
Quels tableurs deviennent quels enregistrements Odoo ?
Associez chaque onglet du classeur à un modèle Odoo, puis importez-les dans l’ordre des dépendances. La règle indiquée dans la documentation d’Odoo est que la cible d’une relation doit exister avant les enregistrements qui la référencent. Le tableau applique cette règle à une entreprise gérée principalement avec Excel.
| Ordre d’import | Votre tableur | Devient dans Odoo | Pourquoi à ce stade |
|---|---|---|---|
| 1 | Sociétés clientes et fournisseurs | Contacts (sociétés) | Les autres éléments en dépendent : les personnes et les commandes les référencent. |
| 2 | Personnes à contacter | Contacts (particuliers) | Chaque ligne référence sa société par son ID externe. |
| 3 | Catégories et étiquettes de produits | Catégories de produits | Les produits font référence à une catégorie. |
| 4 | Catalogue de produits | Produits | Les lignes de commande font référence aux produits. |
| 5 | Devis et commandes en cours | Commandes clients ou fournisseurs avec leurs lignes | Elles référencent les clients et les produits, et viennent donc en dernier. |
Une bonne règle générale consiste à migrer l’état actuel plutôt que l’historique complet : clients actifs, catalogue en production et commandes ouvertes. Des années de commandes clôturées justifient rarement le coût du nettoyage, et un export en lecture seule de l’ancien classeur suffit pour les recherches occasionnelles. Il s’agit d’un choix de gestion, pas d’une exigence d’Odoo : adaptez-le si vos auditeurs ou votre comptable ont besoin de conserver l’historique dans le système.
Comment préparer des données Excel pour un import Odoo
Commencez par un fichier qu’Odoo comprend déjà. L’écran d’import propose un modèle pour les objets courants, avec le mappage des colonnes déjà configuré. Si aucun modèle n’existe pour votre objet, la documentation d’Odoo recommande d’exporter un enregistrement d’exemple avec les champs à importer, afin d’utiliser exactement les bons noms de colonnes. Ne supprimez pas la colonne ID externe d’un modèle.
Supprimez ensuite les habitudes qui rendent un classeur lisible pour les humains, mais difficile à interpréter pour un importateur :
| Habitude Excel | À faire à la place |
|---|---|
| Cellules fusionnées, en-têtes sur deux lignes | Une seule ligne d’en-têtes, un enregistrement par ligne et aucune cellule fusionnée. |
| Totaux, notes et lignes vides de séparation | Supprimez-les. Chaque ligne est importée comme un enregistrement. |
| Dates saisies comme du texte, par exemple 01-03-2016 | Utilisez de vraies cellules de date dans .xlsx, ou le format ISO 8601 (2016-03-01) dans un CSV. Odoo devine les formats de date et ne peut pas distinguer le jour du mois dans 01-03-2016. |
| Prix accompagnés d’un texte de devise, comme ABC 32.000,00 | Utilisez des nombres seuls. Odoo accepte des symboles comme $ ou un signe euro final, mais un symbole de devise inconnu peut faire échouer l’import. |
| Noms de catégories avec des variantes orthographiques | Normalisez-les au préalable. Les colonnes de relation sont comparées aux enregistrements existants par nom ou par ID : chaque variante doit donc renvoyer vers un seul enregistrement. |
| Le même client apparaît deux fois | Dédupliquez le tableau. Les lignes sans ID externe créent toujours de nouveaux enregistrements. |
Choix du type de fichier : privilégiez .xlsx lorsque les données sont saisies dans Excel. Odoo n’affiche pas les options de formatage CSV pour les fichiers Excel : vous n’avez donc pas à vous préoccuper du séparateur ou du format de date, et les vraies cellules de date restent sans ambiguïté. Utilisez un CSV lorsqu’un script ou un autre système génère le fichier.
Comment les ID externes évitent-ils les doublons lors d’un import Odoo ?
L’ID externe est un identifiant unique que vous attribuez à chaque ligne importée. Il n’est pas obligatoire, mais il permet de réaliser les deux opérations indispensables à une véritable migration : importer plusieurs fois le même fichier sans créer de doublons et relier les enregistrements entre eux. Lorsqu’un fichier contient une colonne ID externe ou ID de base de données, les lignes déjà existantes sont mises à jour au lieu d’être créées.
Trois règles déterminent le bon fonctionnement de ce mécanisme :
- Il doit être unique pour tous les objets. L’ID ne doit jamais être répété : un client et un produit ne peuvent donc pas avoir tous deux l’ID
1. Ajoutez un préfixe indiquant la source, commecust_ouprod_. - Il doit rester stable dans le temps. Si un ID est modifié ou supprimé entre deux imports, Odoo ajoute un doublon au lieu de mettre à jour l’enregistrement d’origine.
- Deux enregistrements portant le même ID entrent en conflit. Vérifiez les répétitions avant l’envoi du fichier.
Conseil pratique qui va au-delà de la documentation : construisez l’ID à partir d’une clé métier déjà disponible, comme l’ancien code client ou la référence SKU, plutôt qu’à partir du numéro de ligne. Une séquence recopiée vers le bas convient pour un import unique. En revanche, si vous devez corriger des erreurs et réimporter le fichier, le tri ou l’insertion d’une ligne dans Excel renumérote tout, et l’import suivant crée discrètement des doublons d’enregistrements déjà chargés.
External ID,Name,Is a Company,Related Company/External ID
cust_0041,Hanoi Steel Fittings JSC,True,
cust_0042,Mai Tran,False,cust_0041
La deuxième ligne rattache la personne à la société grâce à l’ID externe de cette dernière. La ligne de la société doit être importée en premier, d’où l’importance de l’ordre présenté dans la section précédente.
Comment importer les relations : sociétés, catégories et lignes de commande
Odoo propose trois façons de référencer un enregistrement associé dans une colonne. Utilisez-en une seule par champ.
| Type de colonne | Exemple | À utiliser quand |
|---|---|---|
| Par nom ou par code | Country: Belgium |
Les données ont été saisies manuellement et les noms sont uniques. |
| Par ID externe | Country/External ID: base.be |
Les données proviennent d’un autre système ou les noms sont en double. |
| Par ID de base de données | Country/Database ID: 21 |
Rarement. Il s’agit surtout d’un outil pour les développeurs, car l’ID correspond au numéro interne d’Odoo. |
La correspondance par nom comporte un piège. Si deux catégories ont le même nom enfant, comme Misc. Products/Sellable et Other Products/Sellable, Odoo arrête la validation, mais peut tout de même autoriser l’import. Chaque ligne est alors reliée à la première correspondance. Odoo déconseille d’importer dans cette situation. Renommez l’une des catégories ou remplacez la colonne par un ID externe.
Champs many-to-many (étiquettes)
Placez les valeurs dans une seule cellule, séparées par des virgules sans espaces, par exemple Manufacturer,Retailer. Dans un fichier CSV, la cellule doit être entourée de guillemets puisque sa valeur contient une virgule :
External ID,Name,Tags
cust_0041,Hanoi Steel Fittings JSC,"Manufacturer,Retailer"
Champs one-to-many (lignes de commande)
Prévoyez une ligne par ligne de commande. La première ligne se trouve sur la même ligne que l’en-tête de la commande. Chaque ligne supplémentaire occupe sa propre ligne, avec toutes les colonnes propres à la commande laissées vides.
External ID,Customer,Order Lines/Product,Order Lines/Quantity
so_0001,Hanoi Steel Fittings JSC,Hex bolt M8,100
,,Washer M8,200
so_0002,Mai Tran,Hex bolt M8,40
Considérez ces noms de colonnes comme des exemples. Les intitulés de champs varient selon l’application et la version. Copiez donc les en-têtes exacts du modèle Odoo ou exportez une commande existante pour les obtenir.
Étape par étape : importer un fichier Excel ou CSV dans Odoo
- Effectuez d’abord une sauvegarde. Sauvegardez la base de données ou réalisez la première tentative sur une copie. Il n’y a pas d’annulation.
- Ouvrez l’écran d’import. Dans la vue liste de l’objet cible, cliquez sur l’icône Action (engrenage), puis choisissez Importer des enregistrements. Dans les anciennes versions, cette option se trouve sous Favoris.
- Chargez le fichier. Téléchargez le modèle d’import de l’objet ou cliquez sur Charger un fichier de données.
- Vérifiez le formatage (CSV uniquement). Contrôlez le séparateur, le délimiteur de texte, le format de date et le séparateur des milliers. Ces options n’apparaissent pas pour les fichiers Excel.
- Vérifiez le mappage des colonnes. Chaque colonne du fichier doit correspondre au bon champ Odoo. Associez manuellement les colonnes non reconnues.
- Cliquez sur Tester, corrigez, puis testez à nouveau. Répétez l’opération jusqu’à ce que le test soit concluant.
- Cliquez sur Importer.
Deux détails peuvent vous faire gagner du temps. Premièrement, Odoo déduit le type de champ de chaque colonne à partir des dix premières lignes du fichier. Une colonne de nombres ne propose donc que des champs entiers. Si le champ nécessaire n’apparaît pas, activez l’option permettant d’afficher les champs des champs de relation (avancé). Deuxièmement, lorsque le mode développeur est activé, le menu Avancé ajoute l’option Suivre l’historique pendant l’import, qui configure les abonnements et les notifications et ralentit l’import, ainsi que l’option Autoriser la correspondance avec les sous-champs.
Pourquoi mon import Odoo échoue-t-il ? Erreurs courantes et solutions
| Symptôme | Cause | Solution |
|---|---|---|
| Toute la ligne apparaît dans une seule colonne | Le séparateur n’est pas une virgule. Odoo ne détecte pas les fichiers séparés par des tabulations. | Adaptez le formatage pour utiliser un autre séparateur ou enregistrez de nouveau le fichier au format séparé par des virgules. |
| Le séparateur change après l’enregistrement depuis Excel | Le tableur applique les paramètres régionaux de l’ordinateur pour le séparateur et le délimiteur. Dans les régions utilisant la virgule décimale, il s’agit généralement du point-virgule. | Enregistrez à nouveau le fichier depuis LibreOffice ou OpenOffice avec l’option de modification des paramètres du filtre, ou définissez l’encodage dans la boîte de dialogue Enregistrer sous d’Excel. |
| Les dates arrivent dans le mauvais mois | Odoo a interprété le jour et le mois dans le mauvais ordre. | Définissez explicitement le format de date sur ISO 8601 ou utilisez de vraies cellules de date dans .xlsx. |
| L’import échoue sur une colonne de prix | Le symbole de devise est inconnu ou le nombre négatif est écrit sous la forme $ (32.000,00). |
Pour les valeurs négatives entre parenthèses, le symbole doit être placé à l’intérieur : (32000.00 €). Le plus sûr reste d’utiliser des nombres seuls. |
| Le champ nécessaire n’est pas proposé pour une colonne | Le type a été déduit à partir des dix premières lignes. | Affichez les champs des champs de relation (avancé), puis sélectionnez manuellement le champ. |
| Les produits sont tous associés à la mauvaise catégorie | Des noms enfants en double ont été associés à la première correspondance. | Renommez les doublons ou utilisez la colonne Category/External ID. |
| Des doublons apparaissent après le deuxième import | Les ID externes ont été modifiés ou supprimés entre les deux exécutions. | Conservez des ID identiques dans tous les fichiers. Réexportez les données avec l’option d’export compatible avec l’import pour les récupérer. |
| Les champs laissés vides deviennent vides au lieu de prendre leur valeur par défaut | Une colonne contenant des cellules vides écrit une valeur vide. Une colonne absente applique la valeur par défaut. | Supprimez les colonnes que vous ne souhaitez pas renseigner. |
Peut-on annuler un import Odoo et quelle peut être la taille du fichier ?
Vous ne pouvez pas annuler un import. La seule aide intégrée d’Odoo consiste à filtrer les enregistrements par date de création ou de dernière modification afin de voir ceux touchés par un import. En pratique, le véritable retour en arrière consiste à restaurer une sauvegarde. C’est pourquoi la première tentative doit être effectuée sur une copie de la base.
La documentation ne fixe aucune limite de lignes. Elle avertit toutefois que les fichiers volumineux peuvent provoquer un dépassement de délai ou empêcher le traitement d’un enregistrement, et recommande de diviser l’import en lots plus petits. Le découpage facilite également le diagnostic : il est plus simple de corriger une mauvaise ligne dans un fichier de 500 lignes que dans un fichier de 20 000 lignes. Si vous importez beaucoup d’images de produits, le mode développeur permet d’afficher une taille maximale de lot et un délai entre les lots.
Comment mettre à jour des enregistrements Odoo depuis un tableur
Le même outil permet de mettre à jour des enregistrements en masse. Sélectionnez les enregistrements dans la vue liste, choisissez Exporter, puis cochez l’option intitulée Je souhaite mettre à jour les données (export compatible avec l’import). La liste des champs est alors limitée aux champs importables et l’ID externe est inclus automatiquement. Modifiez le fichier, puis importez-le selon la procédure habituelle.
Conservez uniquement les colonnes que vous souhaitez modifier et ne touchez jamais à la colonne ID externe. Si l’ID est modifié ou supprimé, Odoo crée un doublon au lieu de mettre à jour l’enregistrement existant.
Cette procédure aller-retour permet également de gérer une transition longue : gardez le tableur comme source de référence jusqu’à la mise en production et réimportez les fichiers corrigés aussi souvent que nécessaire. Cela ne fonctionne que si les ID sont restés stables depuis le premier import.
Quand l’import Excel/CSV ne suffit-il plus ?
L’outil d’import est conçu pour des données organisées en tableau et pouvant être corrigées manuellement. Une migration scriptée est généralement préférable dans les situations suivantes :
- Les données sources nécessitent des règles de transformation ou de validation qui couvrent plusieurs feuilles, par exemple pour diviser une colonne désordonnée en plusieurs attributs.
- Les noms des relations sont ambigus et vous ne pouvez pas renommer les enregistrements sources.
- L’ancien système continue de fonctionner pendant une période de fonctionnement en parallèle, et le chargement doit donc pouvoir être répété et comparé.
- Les volumes sont suffisamment importants pour que le traitement manuel par lots devienne le projet lui-même.
Si votre source est un catalogue de boutique ou un classeur à plusieurs feuilles présentant ces difficultés, le service de migration de données CSV et Excel de Netalith couvre l’approche scriptée, notamment la conservation d’ID stables pour les chargements répétés.
Checklist de migration d’Excel vers Odoo
- Un onglet par modèle Odoo, une seule ligne d’en-têtes, aucune cellule fusionnée ni ligne de total.
- Chaque ligne possède un ID externe préfixé, construit à partir d’une clé métier.
- Les colonnes de relation utilisent le nom uniquement lorsque les noms sont uniques, et l’ID externe dans tous les autres cas.
- Les dates sont de vraies cellules de date ou au format ISO 8601, et les nombres sont saisis seuls.
- Les fichiers suivent l’ordre des dépendances : sociétés, personnes, catégories, produits, commandes.
- La première importation complète a été réalisée sur une copie de la base, avec un test concluant pour chaque fichier.
- Les fichiers volumineux sont divisés en lots et la sauvegarde existe avant l’import en production.
Si vous préférez confier la conception, le développement et la vérification de la migration, consultez le service de développement et de migration Odoo de Netalith.
FAQ
Questions fréquentes
Puis-je importer directement un fichier Excel dans Odoo ?
Oui. L’outil d’import d’Odoo accepte les fichiers .xlsx et .csv pour tout objet métier. Ouvrez la vue liste, cliquez sur l’icône Action, choisissez Importer des enregistrements, chargez le fichier, vérifiez le mappage des colonnes, cliquez sur Tester, puis sur Importer. Les fichiers CSV affichent également les options de formatage du séparateur et du format de date ; les fichiers Excel, eux, ne les affichent pas.
Ai-je besoin d’un ID externe pour importer des données dans Odoo ?
Non, ce n’est pas obligatoire. En revanche, sans ID externe, vous ne pouvez pas réimporter un fichier corrigé en toute sécurité, car chaque ligne crée un nouvel enregistrement, et vous ne pouvez pas relier à cet enregistrement les données provenant d’autres fichiers. Pour toute véritable migration, attribuez à chaque ligne un ID externe unique et stable, avec un préfixe comme cust_ ou prod_.
Puis-je annuler un import Odoo ?
Non. La documentation d’Odoo précise que les imports sont définitifs. Vous pouvez filtrer les enregistrements par date de création ou de dernière modification pour voir ceux touchés, mais le retour en arrière pratique consiste à restaurer une sauvegarde. Réalisez la première importation complète sur une copie de la base.
Dans quel ordre dois-je importer les données dans Odoo ?
Importez la cible d’une relation avant les enregistrements qui la référencent. L’ordre habituel est le suivant : sociétés, personnes à contacter, catégories de produits, produits, puis commandes avec leurs lignes. Chaque fichier suivant référence les enregistrements précédents par leur nom ou leur ID externe.
Pourquoi les dates de mon import Odoo sont-elles incorrectes ?
Odoo déduit le format de date à partir de modèles courants, et une valeur comme 01-03-2016 peut correspondre au format jour-mois ou mois-jour. Dans les fichiers CSV, définissez explicitement le format de date sur ISO 8601 (YYYY-MM-DD). Dans les fichiers Excel, stockez les dates dans de vraies cellules de date plutôt que sous forme de texte.
Comment importer des lignes de commande ou plusieurs étiquettes dans un même fichier ?
Pour les champs many-to-many, comme les étiquettes, placez les valeurs dans une seule cellule, séparées par des virgules sans espaces, et entourez la cellule de guillemets dans un CSV. Pour les champs one-to-many, comme les lignes de commande, placez la première ligne sur la ligne de la commande et chaque ligne supplémentaire sur sa propre ligne, en laissant vides les colonnes propres à la commande.
Quelle taille peut atteindre un fichier d’import Odoo ?
La documentation d’Odoo ne fixe aucune limite précise. Elle avertit que les fichiers très volumineux peuvent provoquer un dépassement de délai ou empêcher le traitement d’un enregistrement, et recommande de diviser l’import en lots plus petits.