La réponse courte
Une base de données ne sait pas lire un fichier .xlsx toute seule. Quelque chose doit lire la feuille, décider du type de chaque colonne, créer une table et insérer les lignes. Vous pouvez laisser faire l'assistant d'import de votre base, charger un CSV avec une commande de chargement en masse, ou générer du SQL simple que n'importe quel client de base de données peut exécuter.
Le SQL généré est la solution la plus portable et la plus facile à vérifier, car vous voyez exactement ce qui sera créé avant de toucher à la base. Dans le convertisseur ci-dessous, ouvrez le fichier .xlsx ou .csv (ou collez des cellules copiées depuis Excel), choisissez la Base de données, saisissez le Nom de la table, puis copiez ou téléchargez le script. Les types de colonnes sont détectés à partir des données, et les codes-barres ou les codes commençant par des zéros restent du texte.
Essayez ici : Excel en SQL
Ouvrir la page complète de l'outilPréparez d'abord la feuille
La plupart des imports ratés viennent du tableur, pas de la base de données. Un tableur est fait pour être lu par des personnes ; une table a besoin d'un seul rectangle de données propre. Prenez deux minutes pour vérifier ces points avant d'importer quoi que ce soit :
- Exactement une ligne d'en-tête avec des noms de colonnes uniques. Supprimez les titres au-dessus du tableau, les cellules d'en-tête fusionnées et les deuxièmes lignes d'en-tête.
- Une ligne par enregistrement. Supprimez les lignes de total et de sous-total, les lignes vides de séparation et les notes sous les données.
- Un seul type de valeur par colonne. Une colonne Prix ne doit pas contenir le texte sur demande dans certaines lignes ; laissez plutôt la cellule vide, elle deviendra NULL.
- Pas de cellules fusionnées dans les données. Annulez la fusion et recopiez la valeur dans chaque ligne concernée.
- Les formules ne posent pas de problème : c'est la dernière valeur calculée enregistrée dans le fichier qui est utilisée. Vérifiez que le classeur a été recalculé et enregistré après la dernière modification.
- Mettez chaque table sur sa propre feuille. Quand un classeur contient plusieurs feuilles, le convertisseur affiche un sélecteur Feuille.
Les méthodes comparées
| Méthode | Idéale pour | Points d'attention |
|---|---|---|
| SQL généré (cette page) | Jusqu'à quelques dizaines de milliers de lignes, toute base, script relisible | Les très gros fichiers donnent de très gros scripts |
| Assistant Importation et exportation SQL Server | Imports réguliers dans SQL Server | Lire un .xlsx demande le Microsoft Access Database Engine ; les versions 32 bits et 64 bits doivent correspondre |
| Import Flat File de SSMS | CSV vers SQL Server | Vérifiez les types devinés avant de terminer |
| BULK INSERT (SQL Server), LOAD DATA (MySQL), COPY (PostgreSQL) | Des millions de lignes depuis un CSV | Droits d'accès au fichier sur le serveur, options de séparateur et d'encodage |
| Table Data Import Wizard de MySQL Workbench | CSV ou JSON vers MySQL | Lent sur les gros fichiers |
| Import/Export de pgAdmin | CSV vers une table PostgreSQL existante | La table doit exister d'abord |
| La commande .import du shell sqlite3 (mode csv) | CSV vers SQLite | Les colonnes sont créées en TEXT si la table n'existe pas |
Étape par étape avec le SQL généré
- Ouvrez le fichier ou collez les cellules. La première ligne donne les noms de colonnes ; décochez La première ligne est l'en-tête si vos données n'en ont pas.
- Choisissez la Base de données : SQL Server, MySQL, PostgreSQL ou SQLite. Les guillemets, les types et l'échappement changent selon ce choix.
- Saisissez le Nom de la table. Avec Simplifier les noms activé, Nom du produit devient nom_du_produit, ce qui vous évite de mettre les noms entre guillemets dans chaque requête ensuite.
- Choisissez Lignes par INSERT. 100 est une valeur sûre ; des lots plus grands s'importent plus vite. SQL Server accepte au maximum 1000 lignes dans une même liste VALUES, l'outil ne dépasse donc jamais ce nombre pour SQL Server.
- Décidez des options : CREATE TABLE écrit la définition de la table, Supprimer d'abord la table efface une table existante du même nom (à réserver aux tables que vous voulez vraiment remplacer), et Utiliser une transaction rend l'import tout ou rien.
- Copiez le SQL ou téléchargez le fichier .sql, puis exécutez-le dans votre client de base de données.
Les types de colonnes choisis par le convertisseur
Chaque colonne reçoit le type le plus étroit qui accepte toutes ses valeurs. Les colonnes de texte reçoivent une longueur arrondie au-dessus de la valeur la plus longue (par exemple VARCHAR(50) pour un maximum de 37 caractères), vous pouvez donc encore les élargir plus tard si besoin.
| Données de la colonne | SQL Server | MySQL | PostgreSQL | SQLite |
|---|---|---|---|---|
| Nombres entiers | INT ou BIGINT | INT ou BIGINT | INTEGER ou BIGINT | INTEGER |
| Nombres décimaux | DECIMAL(p, s) | DECIMAL(p, s) | NUMERIC(p, s) | REAL |
| true ou false | BIT | TINYINT(1) | BOOLEAN | INTEGER |
| Dates | DATE | DATE | DATE | TEXT |
| Date et heure | DATETIME2 | DATETIME | TIMESTAMP | TEXT |
| Texte, codes commençant par zéro | NVARCHAR(n) | VARCHAR(n) | VARCHAR(n) | TEXT |
Problèmes fréquents et comment les éviter
- Les dates arrivent sous forme de nombres comme 45000. Excel enregistre les dates comme un nombre de jours (45000 correspond au 15 mars 2023). Quand vous lisez un .xlsx avec le convertisseur, les cellules de date redeviennent de vraies dates ; d'autres outils demandent parfois de formater d'abord la colonne en date.
- Les zéros au début disparaissent. Les codes-barres, codes postaux et références comme 00123 doivent être du texte. Le convertisseur garde une colonne en texte quand ses valeurs commencent par zéro, et les nombres de plus de 15 chiffres restent aussi du texte.
- Les lettres accentuées deviennent des points d'interrogation dans SQL Server. Le texte Unicode demande des colonnes NVARCHAR et le préfixe N devant les chaînes ; le script généré pour SQL Server utilise les deux. Dans MySQL, utilisez une table en utf8mb4.
- Les nombres à virgule décimale. Dans les fichiers CSV séparés par des points-virgules, des valeurs comme 1.499,90 sont lues comme 1499.90. Dans les fichiers séparés par des virgules, la virgule sépare les colonnes, ces valeurs doivent donc être entre guillemets.
- Les cellules vides. Elles deviennent NULL et la colonne est créée en acceptant les valeurs nulles. Si vous préférez du texte vide, modifiez-le après l'import.
- Les apostrophes dans le texte. Une apostrophe comme dans L'Oréal casserait un INSERT écrit à la main ; les valeurs générées sont échappées, et les barres obliques inverses le sont aussi pour MySQL.
Quand utiliser plutôt un chargement en masse
Les scripts INSERT sont parfaits pour quelques milliers à quelques dizaines de milliers de lignes : vous pouvez les lire, les garder dans un gestionnaire de versions et les exécuter partout. Pour des centaines de milliers ou des millions de lignes, le script devient très gros et son exécution est plus lente qu'un chargement en masse.
Dans ce cas, enregistrez la feuille au format CSV UTF-8 et utilisez la commande de chargement de votre base : BULK INSERT dans SQL Server, LOAD DATA LOCAL INFILE dans MySQL, COPY ou \copy de psql dans PostgreSQL. Une solution intermédiaire pratique consiste à laisser le convertisseur écrire seulement la requête CREATE TABLE à partir d'un extrait des données, pour avoir des types de colonnes cohérents, puis à charger le CSV complet dans cette table avec la commande de chargement en masse.