ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Utilisation/importation/information feuille excel en utilisant SQL   



L'auteur

Francis Faure
France France
Membre Actif (personne physique)
# 0000000001
enregistré le 11/10/2004

http://www.wanagain.net
56 ans
Faure Francis
de la société Design Or Decline
Fiche personnelle


Note des membres
pas de note

Contributions > 01 - PRG : Programmation > Import - Export

Utilisation/importation/information feuille excel en utilisant SQL
# 0000000465
ajouté le 18/08/2007 13:48:20 et modifié le 18/08/2007
consulté 11104 fois
Niveau initié

Description

La plupart des besoins d'imports de feuilles EXCEL dans VFP sont couvert par la commande native de VFP qui est :

IMPORT FROM FileName   [DATABASE DatabaseName [NAME LongTableName]]
   [TYPE] FW2 | MOD | PDOX | RPD | WK1    | WK3 | WKS | WR1 | WRK | XLS
    | XL5 [SHEET cSheetName]   | XL8 [SHEET cSheetName]   [AS nCodePage]

pour aller plus loin (nombre d'onglets, nom des onglets et contenu des onglets), alors il faut manipuler la feuille Excel comme une base de données que l'on accéde avec des commandes SQL au travers d'un driver ODBC. On considère alors les onglets (feuilles/sheets) comme des tables, les lignes comme des enregistrements, et les colonnes comme des champs...

Cordialement

Francis FAURE

Code source :
* Feuilles Excel dans VFP en utilisant SQL
* but : Nombre d'onglets, nom des onglets et contenu des onglets
* pour aller + loin que "IMPORT FORM... TYPE XL8 SHEET ... "

CLEAR
SET TALK off

LOCAL cDriver as String  && nom du driver
LOCAL cFile as String    && nom du fichier excel a traiter
LOCAL ic as Integer      && id connection sql
LOCAL iNombreOnglets as Integer && nombre d'onglets
LOCAL iSheet as Integer

cDriver = "driver={Microsoft Excel Driver (*.xls)}"
cFile = "c:\temp\testxls.xls"

ic = SQLSTRINGCONNECT(cDriver + "; DBQ=" + cFile)
IF m.ic>0
 if SQLTABLES(m.ic, """CursorListSheets")>0
   iNombreOnglets = RECCOUNT()
   ? "Nombre d'onglets = "ALLTRIM(STR(m.iNombreOnglets))
   SCAN
     ? "Nom de l'onglet " + ALLTRIM(STR(RECNO()))+ "=" + ALLTRIM(Table_Name)
     SELECT 0
     iSheet = SQLEXEC(m.ic, "select * from ["+ALLTRIM(CursorListSheets.Table_Name)+"]")
     IF iSheet>0
       ? " Nombre de lignes dans "ALLTRIM(CursorListSheets.Table_Name)+" = "+ALLTRIM(STR(RECCOUNT()))
     endif
     use
     SELECT CursorListSheets
   ENDSCAN
   use
 endif
 =SQLDISCONNECT(m.ic)
endif

Commentaires
le 20/08/2007, Robert Plagnard a écrit :
Bonjour Francis,
C'est bien, mais c'est encore beaucoup plus sympa quand on utilise les ranges dans Excel. Pour simplifier, prenons un range rectangulaire, la première ligne définissant les nom des colonnes de la table et les autres lignes les données. Si "Client" est un tel range la commande :
iTable = SqlExec( "select * from Client", "CurClient" )
te donne une remote table dans le cursor CurClient, avec les bons noms de champ.
Sympa, non?

le 20/08/2007, Francis Faure a écrit :
Bonsoir Robert,
C'est un complément très sympa !
... je ne le savais pas...:$
(et dans l'hypothèse ou le "Range" n'est pas défini dans Excel.... on arrive a récupérer une erreur dans VFP ?)

le 21/08/2007, Robert Plagnard a écrit :
Bonjour Francis,
Je ne m'étais pas posé la question. Si le range n'existe pas, SqlExec retourne -1. Mais le plus interessant c'est SqlTables qui rend un cursor où la colonne Table_Type donne "SYSTEM TABLE" pour les feuilles et "TABLE" pour les ranges. On peut donc connaitre quels sont les ranges succeptibles d'être considérés comme "table".


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3