[RESOLU] Importer fichier Excel

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 636
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Importer fichier Excel

Message par omega »

Bonjour,

Je viens de créer un fichier .CSV en exportant une table sqlite. Y a t-il une possibilité rapide d'importer le fichier Excel, autrement dit, lire champs par champs le fichier créé. J'ai déjà testé la méthode de lecture caractère par caractère en vérifiant la présence du point virgule (caractère séparateur de champs), ça marche mais c'est lourd comme méthode.

Merci
Dernière modification par omega le dim. 08/mars/2020 22:45, modifié 1 fois.
Win7 (x64)
Pb 6.03 LTS
Avatar de l’utilisateur
Ar-S
Messages : 9546
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Importer fichier Excel

Message par Ar-S »

Salut, j'ai une question.
Si tu viens de créer un fichier .CSV en exportant une table sqlite, pourquoi ne la lis tu pas simplement avec PB si le CSV t'ennuie ?
omega a écrit :J'ai déjà testé la méthode de lecture caractère par caractère en vérifiant la présence du point virgule (caractère séparateur de champs), ça marche mais c'est lourd comme méthode.
Bah du CSV c'est du pauvre texte brute séparé par un caractère. Je vois pas ce que tu peux faire d'autre avec ce format, ni en quoi "c'est lourd" de traiter un fichier du genre.
Une liste chainée par ligne puis un stringfield pour séparer les champs. On a vu plus lourd non ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
omega
Messages : 636
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Importer fichier Excel

Message par omega »

Je viens de trouver une meilleure solution, mais cela restera provisoire en attendant de trouver mieux.

Code : Tout sélectionner

;--------------------------------------------------------------------------------------------------------
Procedure importer()
sql="Delete from fProdD"
CheckDatabaseUpdate(idProdD,sql)

Global Chaine$,Dep,Pos,Champ,Long,wMax

     ;Entêtes ou noms des champs
      ;Chaine$="FAMILLE;CODE P.;DESIGNATION DU PRODUIT; U. M. ;QTE INITIALE;P. A.;PRIX DE VENTE"
 
File$="Excel.csv"
If ReadFile(0, File$)  
    While Eof(0) = 0    
      Chaine$=ReadString(0)
 
     If Left(Chaine$,3)="FAM"
        Goto NextLine
      EndIf  
        
      wtaille=Len(chaine$)
      wMax=CountString(chaine$,";")
      For champ=1 To wmax
          dep=pos+1
          pos = FindString(Chaine$,";",1) 
          long=pos-1
          champ$=Left(chaine$,long) 
          chaine$=Mid(chaine$,pos+1,wtaille-Len(champ$)-1)
          If champ=1 : fam$=champ$       : EndIf
          If champ=2 : Codeprod$=champ$  : EndIf
          If champ=3 : prod$=champ$      : EndIf
          If champ=4 : um$=champ$        : EndIf
          If champ=5 : Qi$=champ$        : EndIf
          If champ=6 : Pa$=champ$        : EndIf
          If champ=7 : Pv$=champ$        : EndIf
      Next champ
      Pv$=chaine$
      
      sql="insert into fProdD (fam,Codeprod,Prod,um,qi,Pa,Pv)  values ("
      sql+ Chr(34) + fam$      + Chr(34) + ","   
      sql+ Chr(34) + codeprod$ + Chr(34) + ","   
      sql+ Chr(34) + prod$     + Chr(34) + ","   
      sql+ Chr(34) + um$       + Chr(34) + ","   
      sql+ Chr(34) + qi$      + Chr(34) + ","    
      sql+ Chr(34) + pa$      + Chr(34) + ","   
      sql+ Chr(34) + pv$      + Chr(34) + ")"   
      CheckDatabaseUpdate(idProdD,sql)
   NextLine:
   Wend  
   CloseFile(0)
EndIf
MessageRequester("Terminé","Le fichier excel a été importé avec succès!") 

EndProcedure

Win7 (x64)
Pb 6.03 LTS
Marc56
Messages : 2199
Inscription : sam. 08/févr./2014 15:19

Re: Importer fichier Excel

Message par Marc56 »

...en attendant de trouver mieux.
Ar-S t'a donné mieux il y a 6 minutes, mais peut-être que tu était en train d'écrire ?
StringField() pour découper la ligne lue et aussi supprimer le Goto.
Et j'ajoute
SetDatabaseString() pour remplacer la ligne SQL et permettre ainsi l'insertion de champs pouvant comporter guillemets ou apostrophes.
PS. Quand une variable ne sert que dans une procédure, préférer Protected que Global ainsi la mémoire est libérée dès que la procédure est terminée.

Exemple (à vérifier et améliorer)

Code : Tout sélectionner

Procedure importer()
    sql="Delete from fProdD"
    CheckDatabaseUpdate(idProdD,sql)
    
    Protected Chaine$
    
    ;Entêtes ou noms des champs
    ;Chaine$="FAMILLE;CODE P.;DESIGNATION DU PRODUIT; U. M. ;QTE INITIALE;P. A.;PRIX DE VENTE"
    
    File$="Excel.csv"
    If ReadFile(0, File$) 
        While Eof(0) = 0   
            Chaine$=ReadString(0)
            
            SetDatabaseString(idProdD, 0, StringField(Chaine$, 1, ";"))
            SetDatabaseString(idProdD, 1, StringField(Chaine$, 2, ";"))
            SetDatabaseString(idProdD, 2, StringField(Chaine$, 3, ";"))
            SetDatabaseString(idProdD, 3, StringField(Chaine$, 4, ";"))
            SetDatabaseString(idProdD, 4, StringField(Chaine$, 5, ";"))
            SetDatabaseString(idProdD, 5, StringField(Chaine$, 6, ";"))
            SetDatabaseString(idProdD, 6, StringField(Chaine$, 7, ";"))
            
            sql = "insert into fProdD (fam,Codeprod,Prod,um,qi,Pa,Pv)" + 
                  " values (?, ?, ?, ?, ?, ?, ?);"
            
            CheckDatabaseUpdate(idProdD,sql)
            
        Wend 
        CloseFile(0)
    EndIf
    MessageRequester("Terminé","Le fichier excel a été importé avec succès!")
    
EndProcedure
(pas testé)

Enfin, si tu as beaucoup de lignes à insérer dans la base, tu as intérêt à les mettre toutes dans une seule transaction, ce qui évite les vérifications à chaque insertion. Envoi simplement en requête "BEGIN" au début, puis "COMMIT" après la dernière ligne (ou "ROLLBACK" pour annuler)

:wink:
Avatar de l’utilisateur
omega
Messages : 636
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Importer fichier Excel

Message par omega »

En effet, StringField est exactement ce que je cherchais (ça me donne directement le champ recherché). Cela répond à mon attente. Merci à vous deux et bonne continuation.
Win7 (x64)
Pb 6.03 LTS
Répondre