Page 1 sur 1

[RESOLU] Importer fichier Excel

Publié : sam. 07/mars/2020 21:04
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

Re: Importer fichier Excel

Publié : dim. 08/mars/2020 0:28
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 ?

Re: Importer fichier Excel

Publié : dim. 08/mars/2020 0:34
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


Re: Importer fichier Excel

Publié : dim. 08/mars/2020 8:05
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:

Re: Importer fichier Excel

Publié : dim. 08/mars/2020 18:54
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.