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

Export XLS (via ODBC)   



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

Export XLS (via ODBC)
# 0000000765
ajouté le 10/07/2010 18:19:32 et modifié le 10/07/2010
consulté 9919 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0

Description
Bonjour,

J'ai réceptionné une demande Khaled en email me demandant comment on peut exporter des données VFP dans une feuille Excel avec des données dans différents onglets.
J'ai répondu qu'il y avait plusieurs solutions (Automation, Odbc, ..) comme toujours en VFP

Je propose une illustration avec ODBC ci-après.
Cet exemple prend des morceaux de 2 tables (Clients et Employés) de la base Northwind pour les mettre dans des onglets. (testé avec excel 2003)

Cordialement
Francis
Code source :
*
* Exemple d'exportation (simplifié) vers une feuille Excel en en utilisant odbc / sql
* Francis FAURE
*
* Illustration en exportant un bout de Customers de Northwind
*
SET DATE FRENCH
SET CENTURY on

lsDriver = "driver={Microsoft Excel Driver (*.xls)}"
lsFile = "c:\temp\northwind.xls"
IF FILE(m.lsfile)
  ERASE (m.lsfile)
ENDIF

liC = SQLSTRINGCONNECT(m.lsDriver + "; DBQ=" + m.lsFile+ "; ReadOnly=0;")
IF m.liC>0
  * Export d'un bout de customers dans un onglet customers
  =XLS_Create_WorkSheet(m.liC, "Customers", ;
                         "CUSTOMERID TEXT, "+ ;
                         "COMPANYNAME TEXT, "+;
                         "CONTACTNAME TEXT, "+;
                         "COUNTRY TEXT")
  USE HOME()+"samples\northwind\customers" SHARED
  SCAN
    WAIT windows COMPANYNAME nowait
    =XLS_AddData(m.liC, "Customers", ;
                        "CUSTOMERID, COMPANYNAME, CONTACTNAME, COUNTRY", ;
                        [']+Clean(CUSTOMERID)+[',]+;
                        [']+Clean(COMPANYNAME)+[',]+;
                        [']+Clean(CONTACTNAME)+[',]+;
                        [']+Clean(COUNTRY)+['])
  ENDSCAN
  use

  * Export d'un bout de Employees dans un onglet Employees
  =XLS_Create_WorkSheet(m.liC, "Employees", ;
                         "EMPLOYEEID NUMBER, "+ ;
                         "LASTNAME TEXT, "+;
                         "FIRSTNAME TEXT, "+;
                         "BIRTHDATE DATE")
  USE HOME()+"samples\northwind\Employees" SHARED
  SCAN
    WAIT windows LASTNAME nowait
    =XLS_AddData(m.liC, "Employees", ;
                        "EMPLOYEEID, LASTNAME, FIRSTNAME, BIRTHDATE", ;
                        ALLTRIM(STR(EMPLOYEEID))+[,]+;
                        [']+Clean(LASTNAME)+[',]+;
                        [']+Clean(FIRSTNAME)+[',]+;
                        [']+DTOC(BIRTHDATE)+['])
  endscan
  use


  WAIT clear
  =SQLDISCONNECT(m.lic)
ELSE
  ? MESSAGE()
ENDIF


* Ouvrir le fichier excel
DECLARE INTEGER ShellExecute IN shell32.dll ;
        INTEGER hndWin, STRING cAction, STRING cFileName, ;
        STRING cParams, STRING cDir, INTEGER nShowWin
=ShellExecute(0, "Open", m.lsFile, """", 1)


* Alltrim + transformation de ' en '' car le ' est le délimiteur de champ
FUNCTION Clean(lsString) as String
RETURN STRTRAN(ALLTRIM(m.lsString), ['][''])


* Créer un onglet ("une table") dans la feuille Excel
* (l'onglet ne doit pas exister)
* retourne le résultat de sqlexec
FUNCTION XLS_Create_WorkSheet(liC as Integer, ;
                              lsSheet as String, ;
                              lsColumns_name_and_type as stringas Integer
LOCAL lsSql as string
LOCAL lsReturn as Integer
  lsReturn=-1
  IF m.liC>0
    lsSql ="create table "+ALLTRIM(m.lsSheet)+;
           " ("+lsColumns_name_and_type +")"
    lsReturn = SQLEXEC(m.LiC, m.lsSql)
    IF m.lsReturn=-1
      * Erreurs a gérer
      ? MESSAGE()
    endif
  ENDIF
  RETURN m.lsReturn
ENDPROC

* Insére des données dans un un onglet
* retourne le résultat de sqlexec
FUNCTION XLS_AddData(liC as Integer, ;
                     lsSheet as String, ;
                     lsColumns_name_and_type as string,;
                     lsValues as stringas Integer
LOCAL lsSql as string
LOCAL lsReturn as Integer
  lsReturn=-1
  IF m.liC>0
    lsSql ="insert into "+ALLTRIM(m.lsSheet)+;
           " ("+lsColumns_name_and_type +") "+;
           " values ("+m.lsValues+")"
    lsReturn = SQLEXEC(m.LiC, m.lsSql)
    IF m.lsReturn=-1
      * Erreurs a gérer
      ? MESSAGE()
    endif
  ENDIF
  RETURN m.lsReturn
ENDPROC


Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :


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