10 mai 2011

[snippet] Convertir une table HyperFile en fichier Excel

Il existe deux solutions.
1ère solution, ouvrir la table avec WDMap puis clic droit > Export vers Excel.
2nde solution, par programmation WinDev :


// le traitement suivant permet de générer un fichier CSV ou Excel
// à partir d'un fichier .FIC fourni en paramètre, dont le programme ne possède pas l'analyse.
//

ficHF est une chaîne = "fichier.FIC"
ficOut est une chaîne = "fichier.xls"
typeexport est une chaîne = "xls"
pass est une chaîne = ""
noheader est un booléen = Faux
typeheader est un booléen = Faux
enc est une chaîne = """"
sep est une chaîne = ";"
uneTable est une Source de Données
SI PAS HDéclareExterne(ficHF, uneTable, pass) ALORS
       RETURN
FIN

SI HOuvre({uneTable,indFichier},pass,hOLecture) ALORS // tentative d'ouverture de la table
       // recherche des Rubriques de la table
       txtRub est une chaîne = HListeRubrique({uneTable,indFichier},hLstDétail) // récupération des rubriques détaillées
       nbRub est un entier = ChaîneOccurrence(txtRub,RC) // nombre de rubriques de la table
       nbRub++
       tabRub est un tableau de nbRub chaînes // stockera les noms des rubriques
       tabType est un tableau de nbRub chaînes // stockera les types des rubriques
       pos est un entier = 1
       uneRub est une chaîne = ExtraitChaîne(txtRub,pos,RC) // première rubrique
       TANTQUE uneRub<>EOT
             tabRub[pos] = ExtraitChaîne(uneRub,1,TAB)
             tabType[pos] = ExtraitChaîne(uneRub,2,TAB)+"("+ExtraitChaîne(uneRub,4,TAB)+")"
             pos++
             uneRub=ExtraitChaîne(txtRub,pos,RC)
       FIN
      
       idCol est un entier
       maVue est une Source de Données
       HCréeVue(maVue,uneTable,"*",hVueDéfaut) // passer par une vue pour parcourir la table
      
       IF typeexport <> "xls" THEN // si l'export demandé n'est pas XLS, il est alors en CSV :
             csv est un entier = fOuvre(ficOut,foCréation+foEcriture) // fichier de destination
             IF csv = -1 THEN
                    RETURN
             END
             ligne est une chaîne
             // Entête du fichier CSV : nom des rubriques
             IF noheader = "" OR noheader = 0 THEN
                    ligne = ""
                    POUR idCol = 1 A nbRub
                           ligne += enc+tabRub[idCol]+enc+sep
                    FIN
                    ligne = Gauche(ligne,Taille(ligne)-1)
                    fEcritLigne(csv,ligne)
             END
             // seconde entête : les types
             IF typeheader <> "" ET typeheader <> 0 THEN
                    ligne = ""
                    POUR idCol = 1 A nbRub
                           ligne += enc+tabType[idCol]+enc+sep
                    FIN
                    ligne = Gauche(ligne,Taille(ligne)-1)
                    fEcritLigne(csv,ligne)
             END
            
             // Remplissage du fichier CSV
             HLitPremier(maVue)
             TANTQUE PAS HEnDehors(maVue)
                    ligne = ""
                    POUR idCol = 1 A nbRub // pour chaque rubrique de l'enregistrement
                           ligne += enc+{"maVue."+tabRub[idCol],indRubrique}+enc+sep // on ajoute la valeur à la ligne courante, avec les séparateurs
                    FIN
                    ligne = Gauche(ligne,Taille(ligne)-1)
                    fEcritLigne(csv,ligne) // on écrit la ligne
                    HLitSuivant(maVue)
             FIN
             HFerme({uneTable,indFichier})
             fFerme(csv)
             RETURN // terminé avec succès
            
            
       ELSE // EXCEL
             xls est un xlsDocument
             xlsAjouteFeuille(xls,fExtraitChemin(ficHF,fFichier))
             descripteur est un booléen = xlsSauve(xls, ficOut) // création d'un fichier Excel vierge
             SI descripteur = -1 ALORS
                    RETURN
             FIN
             idLigne est un entier = 1
            
             // Entête du fichier Excel : nom des rubriques
             IF noheader = "" OR noheader = 0 THEN
                    POUR idCol = 1 A nbRub
                           xls[idLigne,idCol] = tabRub[idCol]
                    FIN
                    idLigne++
             END
             // seconde entête : les types
             IF typeheader <> "" ET typeheader <> 0 THEN
                    POUR idCol = 1 A nbRub
                           xls[idLigne,idCol] = tabType[idCol]
                    FIN
                    idLigne++
             END
            
            
             // Remplissage du fichier Excel
             HLitPremier(maVue)
             TANTQUE PAS HEnDehors(maVue)
                    idCol = 1
                    POUR idCol = 1 A nbRub // pour chaque rubrique, on ajoute la valeur dans la cellule
                           xls[idLigne,idCol] = {"maVue."+tabRub[idCol],indRubrique}
                    FIN
                    idLigne++
                    HLitSuivant(maVue)
             FIN
             HFerme({uneTable,indFichier})
             xlsSauve(xls,ficOut)
             xlsFerme(xls)
             RETURN // terminé avec succès
       END
FIN