XLDB : Une base de données Excel via
ODBC
https://codes-sources.commentcamarche.net/source/29468
Par Patrice Dargenton
http://patrice.dargenton.free.fr/index.html
Version 1.0 du 13/02/2005
Ce logiciel permet de faire des requêtes SQL sur un
fichier Excel vu en tant que base de données grâce à ODBC. Chaque feuille Excel
est vue en tant que table de la base, il suffit que la première ligne
contiennent les entêtes des colonnes pour pouvoir préciser les champs dans la
requête SQL. Si la première ligne ne contient pas les entêtes, on peut quand
même lire toute la feuille Excel d'un coup.
On peut même
faire des joints entre deux tables pour récupérer un tableau regroupant les
données des deux tables via un champ pivot (ce qui équivaut sous Access à une
relation sans intégrité référentielle, c'est-à-dire qu'on ne peut pas forcer
l'existence de la valeur pivot dans l'autre table).
La chaîne de
connexion ODBC est directe sur le fichier Excel, mais on peut aussi indiquer un
fichier .dsn pour paramétrer la connexion à
l'extérieur du logiciel, ce qui permet en théorie d'indiquer n'importe quelle
source de données ODBC, même après avoir compilé le programme. Le problème,
c'est que la syntaxe SQL diffère légèrement mais fatalement de la syntaxe SQL
normale : il faut indiquer chaque table avec un $ à la fin et donc la mettre
entre crochet, par exemple "Select * From
[Article$]". Cette syntaxe est complètement idiote (sous Access on
n'utilise les crochets que pour les noms de table contenant des espaces) et
compromet l'utilisation de ce principe du fichier .dsn
pour fonctionner avec une source de données ODBC quelconque. En fait, l'utilité
principale de ce système n'est pas vraiment d'utiliser Excel en tant que base
de données (limité à 65000 lignes, pas d'intégrité référentielle, pas de
contrôle des doublons, ...), mais plutôt de lire très rapidement le contenu
d'un fichier Excel.
Notes :
- On peut
saisir des valeurs à la volée dans Excel et faire des requêtes sans avoir à
sauver le fichier (ce qui est impossible avec une vrai base de données) ;
- Selon
leur format, le contenu des champs Excel peuvent dépendre des paramètres
régionaux de Windows au moment de la requête : séparateur décimal ou monétaire,
date, ... vérifiez donc plusieurs configurations avant de distribuer un
logiciel...
Limitations :
- Bug :
On reçoit l'erreur -2147467259 (80004005 : "L'ordre de tri sélectionné
n'est pas géré par le système d'exploitation" ou "Selected
collating sequence not supported by the operating
system") lors du premier lancement dans l'IDE de
Visual Basic (mais pas pour les programmes compilés)
pour des requêtes autres que "Select * From
Table1", par exemple avec des requêtes du type "Select Champ1 From Table1"). On a également cette erreur pour des
joints entre plusieurs tables, voir l'article MSDN :
http://support.microsoft.com/kb/246167/en-us
- Attention
au mélange des données numériques et textes dans une même colonne : ce mélange
risque de produire une perte de données car l'extraction ODBC ne peut pas
obtenir simultanément l'un et l'autre des 2 types de données. Solution :
modifier le fichier Excel avec un format Texte ET convertir les données de la
colonne via le menu Données : Convertir... en précisant le format Texte à la
troisième et dernière étape de l'assistant conversion de données (pourtant,
lorsque l'on enregistre le fichier Excel en .csv,
cela fonctionne : Excel effectue cette conversion à ce moment là) ;
Description du bug : Excel Values Returned as NULL :
http://support.microsoft.com/kb/194124/EN-US/
Description de la solution :
Format existing numbers as text : Three ways to convert numbers to text :
http://office.microsoft.com/en-us/assistance/HA011366191033.aspx
Voir
aussi :
- DBComp2 :
le comparateur de structure de base de données Access (ou ODBC) avec Windiff
www.vbfrance.com/code.aspx?ID=17847 : DBComp2.05
- ODBCDotNet
: Extraire des requêtes ODBC dans un tableau de tableaux de String
www.vbfrance.com/code.aspx?ID=34701
- XL2Csv :
Convertir un fichier Excel en fichiers Csv (ou en 1 fichier txt,
ce qui peut servir à comparer le contenu de fichiers Excels
via Windiff)