A tu essayer
L' Utilisation de la fonction fLitLigne
Voir
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
-
Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !Rejeter la notice
WD importation de gros fichier excel vers HFSQL ou le parcourir
Discussion dans 'Résolution problème & conseils' créé par elhacene, Oct 17, 2018.
Page 1 sur 3
J'ai importé lors de la création de fichier, dans l'analyse, un fichier csv qui donne un fichier de 1 906 884 lignes , bon j'ai 9 colonnes ( je ne pouvais pas le faire sur excel car 32 bits, mais j'ai trouvé un prog ( macro excel qui générait les calculs de combinaisons en fichier csv, assez long mais efficace)
J'ai importé lors de la création de fichier, dans l'analyse, un fichier csv qui donne un fichier de 1 906 884 lignes , bon j'ai 9 colonnes ( je ne pouvais pas le faire sur excel car 32 bits, mais j'ai trouvé un prog ( macro excel qui générait les calculs de combinaisons en fichier csv, assez long mais efficace)Cliquez pour agrandir...
avec le format Xls par programmation sa se passe sans problèm sauf que le fichier en format xls est limité a 65535

et avec Xlsx avec un fichier qui dépasse ce nombre windev a du mal a lire le contenu et message erreur "vous avez appelé la fonction xlsouvre erreur pendant la lecture de la valeur //sheet/sheet[@] not found. "
je pense que la fonction xlsouvre() n'a pas été revu par pcsoft pour le format xlsx!
joker apprécie ceci.
Et, comme plus haut tu dis ça:
"
j'ai essayé avec csv mais windev ce plonte et toure en rond, mon fichier a 50 colone et plus de 287 557 ligne !!!!!
quand je prend juste une petite partie sa fonction l'importation direct ou par programation !!!!!!!!!!!!!"
Je voulais te dire que ce fichier à plus de lignes et je l'ai importé direct par l'import de données dans l'analyse, mais c'est vrai il n'a pas autant de colonnes.
c'est un csv de 40 mégas
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
: tu dis
"avec le format Xls par programmation sa se passe sans problèm sauf que le fichier en format xls est limité a 65535"
Alors qu'en 64 bits un xls peut ouvrir jusqu'au million je crois, mais il y a des problemes de mémoire
Voir dessous pour ceux qui ont office 20016
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
L’environnement 32 bits requiert 2 gigaoctets (Go) d’espace d’adressage virtuel, partagé par Excel, le classeur et les compléments s’exécutant dans le même processus. Le partage d’un modèle de données de l’espace d’adressage peut utiliser 500 à 700 Mo, mais peut en utiliser moins si les autres modèles de données et les compléments sont chargés.
L’environnement 64 bits n’impose aucune limite stricte pour la taille de fichier. La taille de classeur est limitée uniquement par la mémoire et les ressources système disponibles.
Excel 2016 inclut la fonctionnalité LAA (Large Address Aware) qui permet à la version 32 bits d’Excel 2016 de consommer le double de mémoire lorsque les utilisateurs ont un système d’exploitation Windows 64 bits. Pour plus d’informations, voirBonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
.
Oh!!! c'est du gros travail que ta fait pour moi sa me touche vraiment,!!
bref, j'ai déjas passé par ces méthode en capture sauf que j'ai pas pensé au 64 bit par contre un détail important il faut le prendre c'est de faire passé les fichier fic en 2 go dans l'analyse.
avec mon fichier sa taille est de 70 mo avec xlsx et c'est impossible de le lire pas ta méthode vu que la fonction xlsnbligne renvoi 0 ligne pour les gros fichier
et en le passant en xls sa se prend que 65535 par feuill et la windev arrive a les lire donc j'ai du cre 6 feuille pour répartir les ligne "la taille passe a 135 mo" puis lire avec windev feuil par feuil.
je suis maintenant a 151000 ligne en fic et la taille dépasse 3.45Go heuresement que j'ai activé l'option 2go , il me rest encore 136557 ligne a importé
mais cette méthode et très lourdre vu que le fichier et actualisé chaque 6 mois et l'utilisateur final ne connais pas windev!!![]()
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Si le but est de ne pas utiliser Excel, je ne vois pas d’autre solution,
mais avant que Pcsoft développe ces méthodes sans Excel,
on utilisait directement Excel, plus lent mais avec les limites d’Excel.
J’ai l’habitude de convertir toutes mes commandes VBA sous WD,
le test avec plus d’1 million de lignes et 77 colonnes fonctionne bien :
A+.Code (Windev):nXlUp est un entier = -4162
nXlDown est un entier = -4121
nXlRight est un entier = -4161
nXlLeft est un entier = -4159
nLignes est un entier
nColonnes est un entier
sFichierXLS est une chaîne = "Test_1M.xlsx"
xlsFichier est un objet OLE "Excel.Application"
xlsFichier>>Visible = OLEFaux
QUAND EXCEPTION DANS
xlsFichier>>Workbooks>>Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(sFichierXLS)
FAIRE
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
("Impossible d'ouvrir le fichier Excel !")
RETOUR
FIN
nLignes = xlsFichier>>WorkSheets(1)>>Range("A1")>>End(nXlDown)>>Row
nColonnes = xlsFichier>>WorkSheets(1)>>Range("A1")>>End(nXlRight)>>Column
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
(nLignes + " x " + nColonnes)
POUR nPosLig = 2 _À_ nLignes
POUR nPosCol = 1 _À_ nColonnes
SI PAS xlsFichier>>WorkSheets(1)>>Cells(nPosLig, nPosCol)>>Value = "" ALORS
// La donnée n'est pas vide
FIN
FIN
FIN
xlsFichier>>ActiveWorkbook>>Saved = OLEVrai
xlsFichier>>Workbooks>>Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
()
xlsFichier>>Quit()
rober, elhacene, joker et 1 autre personne aiment ça.
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Si le but est de ne pas utiliser Excel, je ne vois pas d’autre solution,
mais avant que Pcsoft développe ces méthodes sans Excel,
on utilisait directement Excel, plus lent mais avec les limites d’Excel.
J’ai l’habitude de convertir toutes mes commandes VBA sous WD,
le test avec plus d’1 million de lignes et 77 colonnes fonctionne bien :
A+.Code (Text):nXlUp est un entier = -4162
nXlDown est un entier = -4121
nXlRight est un entier = -4161
nXlLeft est un entier = -4159
nLignes est un entier
nColonnes est un entier
sFichierXLS est une chaîne = "Test_1M.xlsx"
xlsFichier est un objet OLE "Excel.Application"
xlsFichier>>Visible = OLEFaux
QUAND EXCEPTION DANS
xlsFichier>>Workbooks>>Open(sFichierXLS)
FAIRE
Erreur("Impossible d'ouvrir le fichier Excel !")
RETOUR
FIN
nLignes = xlsFichier>>WorkSheets(1)>>Range("A1")>>End(nXlDown)>>Row
nColonnes = xlsFichier>>WorkSheets(1)>>Range("A1")>>End(nXlRight)>>Column
Info(nLignes + " x " + nColonnes)
POUR nPosLig = 2 _À_ nLignes
POUR nPosCol = 1 _À_ nColonnes
SI PAS xlsFichier>>WorkSheets(1)>>Cells(nPosLig, nPosCol)>>Value = "" ALORS
// La donnée n'est pas vide
FIN
FIN
FIN
xlsFichier>>ActiveWorkbook>>Saved = OLEVrai
xlsFichier>>Workbooks>>Close()
xlsFichier>>Quit()Cliquez pour agrandir...
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
je vais testé sa, mais peut tu expliqué comment utilisé ton code ,je veux bien le testé pour calculer la vitesse de transfere avec la méthode de
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
qui est parfaitejolie tes plus rapide que ton embre
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
La manipulation d’Excel ne pourra jamais être plus rapide qu’un code compilé en C++
qui lira directement le fichier, mais ce code pourrait avoir ces limites qu’Excel n’a pas.
Et l’autre soucis de cette manipulation, c’est qu’elle est manuelle (à voir si on ne pas manipuler l’exe en code),
contrairement au pilotage plus lent mais automatisable.
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Merci, je devrai faire des tests dans le cas où l’on n’a pas le choix de la manipulation Excel,
et voir si mes méthodes ne peuvent pas être optimisées (j’en ai déjà une ici).
Dans ton code, pour faire de vrais tests, il ne faut pas que l’affichage impact le traitement.
Il faut annuler l’affichage de la table après le sablier :
Et l’actualiser avant la restitution du sablier :Code (Text):Table_amigo..AffichageActif = Faux
Avec ça, sur 926 lignes, je passe de 39s à 15s.Code (Text):Table_amigo..AffichageActif = Vrai
Au fait, quand on veut vérifier un temps de traitement, on utilise : ChronoDébut()
En réfléchissant, l’objet automation est reconstruit à chaque passage de boucle,
on peut encore optimiser le code en gardant l’objet de la feuille Excel :
Pour le reste, on replace dans la boucle xlsFichier>>WorkSheets(1) par pautFeuilleXLS.Code (Text):pautFeuilleXLS est un objet Automation dynamique
...
pautFeuilleXLS = xlsFichier>>WorkSheets(1)
nLignes = pautFeuilleXLS>>Range("A1")>>End(nXlDown)>>Row
nColonnes = pautFeuilleXLS>>Range("A1")>>End(nXlRight)>>Column
Avec la sauvegarde de la feuille en cours, je passe de 15s à 10s pour mes 926 lignes.
Résultat : je passe de 39s à 10s.
PCSoft a sorti une classe cExel, ce serait peut-être plus simple à lire pour vous,
mais l’avantage de manipuler vous-même Excel est de pouvoir répondre à n’importe
qu’elle demande en WD du moment qu’Excel sait faire.
Par exemple : enregistrer les fichiers Excel en PDF sans imprimer,
au format numérique (pas une image) (Office 2007 et +) (ou Word en PDF) en une seule ligne (de plus) :
Un fichier PDF de la feuille "marché" jusqu’à la feuille avant les photos, en utilisant le nom des feuilles au lieu des index,Code (Text):xlsFichier>>ActiveWorkbook>>ExportAsFixedFormat(xlTypePDF, "fichier.pdf", xlQualityStandard, OLEFaux, OLEFaux, xlsFichier>>Sheets(sFeuilleMarche)>>Index, xlsFichier>>Sheets(sPagePhoto)>>Index - 1)
mais je dois donner leurs index pour la méthode.
A+.
joker, suenodesign et elhacene aiment ça.
Je me doutais que HImporteXLS aurait les mêmes limites,
mais en mariant les deux mondes, on pourrais gagner du temps.
Le principe est de lire le fichier Excel avec ce qui peut le lire (ici OLE),
de le découper aux limites des possibilités de HImporteXLS (ici j’ai mis 4 000 000 cellules),
puis de donner à la fonction les fichiers du découpage un par un.
Un fichier Excel de 310 000 lignes sur 72 colonnes met 3 min 30 s.
Je me suis dit qu’un jour j’en aurais peut-être besoin, j’ai donc fait une p'tit appli avec un peu plus d’options.Code (Text):nXlUp est un entier = -4162
nXlDown est un entier = -4121
nXlRight est un entier = -4161
nXlLeft est un entier = -4159
sFichierXLS est une chaîne = "Test_310.xlsx"
sFichierFic est une chaîne = "IMPORT"
nOngletExcel est un entier = 1
nMaxDonnees est un entier = 4 000 000
nMaxLignes est un entier
nLignes, nColonnes sont des entiers
nPosLigne, nPosDerLigne est un entier
nNumFichier est un entier
dfFichierFIC est une Description de Fichier
drRubriqueFIC est une Description de Rubrique
autObjXLS est un objet OLE "Excel.Application"
autObjXLS>>Visible = OLEFaux
ChronoDébut()
QUAND EXCEPTION DANS
autObjXLS>>Workbooks>>Open(fRepEnCours() + "\" + sFichierXLS)
FAIRE
Erreur("Impossible d'ouvrir le fichier Excel !")
RETOUR
FIN
nLignes = autObjXLS>>WorkSheets(nOngletExcel)>>Range("A1")>>End(nXlDown)>>Row
nColonnes = autObjXLS>>WorkSheets(nOngletExcel)>>Range("A1")>>End(nXlRight)>>Column
// Déclaration du FIC
dfFichierFIC..Nom = sFichierFic
dfFichierFIC..Type = hFichierNormal
//dfFichier..CryptageFic = hCryptageStandard
dfFichierFIC..GrosFichier = Vrai
// Création des autres rubriques à partir de la 1ère ligne
// Attention, les noms sur la 1ère ligne doivent être uniques
POUR nPosCol = 1 _À_ nColonnes
drRubriqueFIC..Nom = autObjXLS>>WorkSheets(nOngletExcel)>>Cells(1, nPosCol)>>Value
drRubriqueFIC..Type = hRubTexte
drRubriqueFIC..Taille = 50
//drRubriqueFic..NullAutorisé = vrai
HDécritRubrique(dfFichierFIC, drRubriqueFIC)
FIN
HDécritFichier(dfFichierFIC)
nMaxLignes = nMaxDonnees / nColonnes
// Découpage du XLSX si hors limites
SI nLignes > nMaxLignes ALORS
nPosLigne = 2 // Début des données
nPosDerLigne = nPosLigne + nMaxLignes // Dernière de la limite
nNumFichier = 1 // Nom des fichiers 1_, 2_ ...
TANTQUE nPosDerLigne <= nLignes
autObjXLS>>WorkSheets(nOngletExcel)>>Rows(nPosLigne + ":" + nPosDerLigne)>>Copy
autObjXLS>>Workbooks>>Add // Nouveau fichier Excel
autObjXLS>>ActiveSheet>>Paste // Colle les lignes
autObjXLS>>ActiveWorkbook>>SaveAs(fRepEnCours() + "\" + nNumFichier + "_" + sFichierXLS)
autObjXLS>>ActiveWorkbook>>Close()
nPosLigne = nPosDerLigne + 1
nPosDerLigne = nPosLigne + nMaxLignes
SI nPosDerLigne > nLignes ALORS
SI nPosLigne > nLignes ALORS // A-t-on fini ?
nPosDerLigne = nLignes + 1
SINON
nPosDerLigne = nLignes
FIN
FIN
nNumFichier++
FIN
FIN
autObjXLS>>ActiveWorkbook>>Saved = OLEVrai
autObjXLS>>Workbooks>>Close()
autObjXLS>>Quit()
SI nNumFichier = 1 ALORS
HImporteXLS(sFichierFic, sFichierXLS, nOngletExcel, "", hImpIgnorePremièreLigne)
SINON
POUR nPos = 1 _À_ nNumFichier - 1
HImporteXLS(sFichierFic, nPos + "_" + sFichierXLS) // Boucle sur les fichiers générés
FIN
FIN
duDurée est une Durée = ChronoFin()
Info("fini en " + DuréeVersChaîne(duDurée, "MMm et SSs"))
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Exe + sources en WD 22 :Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Pour aller plus loin avec ceux qui ne possèdent pas la table :
Il faudrait que dans la description des champs, je détecte le format de donnée à partir d’Excel, au lieu de la laisser au format texte.
Et pour aider encore plus, sortir la description des champs de la table en XML ou autres, pour l’importer rapidement dans l’analyse.
PS : j’ai banni la jauge, elle multiplie le traitement par 3.
A+.
elhacene, suenodesign, Bip_bip et 3 autres personnes aiment ça.
bonjours,
désolé pour le retard , je monque du temps mes amis, c'est que aujourd'hui que je me reconnect bref,Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
je viens juste de lire ta solution j'ai pas encore testé "je rentre au bolo dans 3j", mais vous dite que 310 000 lignes sur 72 colonnes met 3 min 30 s !!!!bin mois avec mes 287 557 sur 50 collone avec la méthode de mon amigo
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
avec petite modification à pris plus de 3h et 30 m mais un bon réussi
donc je doit testé ta méthode sur mon pc pour prendre des conclusions.
merci
Je me doutais que HImporteXLS aurait les mêmes limites,
mais en mariant les deux mondes, on pourrais gagner du temps.
Le principe est de lire le fichier Excel avec ce qui peut le lire (ici OLE),
de le découper aux limites des possibilités de HImporteXLS (ici j’ai mis 4 000 000 cellules),
puis de donner à la fonction les fichiers du découpage un par un.
Un fichier Excel de 310 000 lignes sur 72 colonnes met 3 min 30 s.
Je me suis dit qu’un jour j’en aurais peut-être besoin, j’ai donc fait une p'tit appli avec un peu plus d’options.Code (Text):nXlUp est un entier = -4162
nXlDown est un entier = -4121
nXlRight est un entier = -4161
nXlLeft est un entier = -4159
sFichierXLS est une chaîne = "Test_310.xlsx"
sFichierFic est une chaîne = "IMPORT"
nOngletExcel est un entier = 1
nMaxDonnees est un entier = 4 000 000
nMaxLignes est un entier
nLignes, nColonnes sont des entiers
nPosLigne, nPosDerLigne est un entier
nNumFichier est un entier
dfFichierFIC est une Description de Fichier
drRubriqueFIC est une Description de Rubrique
autObjXLS est un objet OLE "Excel.Application"
autObjXLS>>Visible = OLEFaux
ChronoDébut()
QUAND EXCEPTION DANS
autObjXLS>>Workbooks>>Open(fRepEnCours() + "\" + sFichierXLS)
FAIRE
Erreur("Impossible d'ouvrir le fichier Excel !")
RETOUR
FIN
nLignes = autObjXLS>>WorkSheets(nOngletExcel)>>Range("A1")>>End(nXlDown)>>Row
nColonnes = autObjXLS>>WorkSheets(nOngletExcel)>>Range("A1")>>End(nXlRight)>>Column
// Déclaration du FIC
dfFichierFIC..Nom = sFichierFic
dfFichierFIC..Type = hFichierNormal
//dfFichier..CryptageFic = hCryptageStandard
dfFichierFIC..GrosFichier = Vrai
// Création des autres rubriques à partir de la 1ère ligne
// Attention, les noms sur la 1ère ligne doivent être uniques
POUR nPosCol = 1 _À_ nColonnes
drRubriqueFIC..Nom = autObjXLS>>WorkSheets(nOngletExcel)>>Cells(1, nPosCol)>>Value
drRubriqueFIC..Type = hRubTexte
drRubriqueFIC..Taille = 50
//drRubriqueFic..NullAutorisé = vrai
HDécritRubrique(dfFichierFIC, drRubriqueFIC)
FIN
HDécritFichier(dfFichierFIC)
nMaxLignes = nMaxDonnees / nColonnes
// Découpage du XLSX si hors limites
SI nLignes > nMaxLignes ALORS
nPosLigne = 2 // Début des données
nPosDerLigne = nPosLigne + nMaxLignes // Dernière de la limite
nNumFichier = 1 // Nom des fichiers 1_, 2_ ...
TANTQUE nPosDerLigne <= nLignes
autObjXLS>>WorkSheets(nOngletExcel)>>Rows(nPosLigne + ":" + nPosDerLigne)>>Copy
autObjXLS>>Workbooks>>Add // Nouveau fichier Excel
autObjXLS>>ActiveSheet>>Paste // Colle les lignes
autObjXLS>>ActiveWorkbook>>SaveAs(fRepEnCours() + "\" + nNumFichier + "_" + sFichierXLS)
autObjXLS>>ActiveWorkbook>>Close()
nPosLigne = nPosDerLigne + 1
nPosDerLigne = nPosLigne + nMaxLignes
SI nPosDerLigne > nLignes ALORS
SI nPosLigne > nLignes ALORS // A-t-on fini ?
nPosDerLigne = nLignes + 1
SINON
nPosDerLigne = nLignes
FIN
FIN
nNumFichier++
FIN
FIN
autObjXLS>>ActiveWorkbook>>Saved = OLEVrai
autObjXLS>>Workbooks>>Close()
autObjXLS>>Quit()
SI nNumFichier = 1 ALORS
HImporteXLS(sFichierFic, sFichierXLS, nOngletExcel, "", hImpIgnorePremièreLigne)
SINON
POUR nPos = 1 _À_ nNumFichier - 1
HImporteXLS(sFichierFic, nPos + "_" + sFichierXLS) // Boucle sur les fichiers générés
FIN
FIN
duDurée est une Durée = ChronoFin()
Info("fini en " + DuréeVersChaîne(duDurée, "MMm et SSs"))
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Exe + sources en WD 22 :Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
Pour aller plus loin avec ceux qui ne possèdent pas la table :
Il faudrait que dans la description des champs, je détecte le format de donnée à partir d’Excel, au lieu de la laisser au format texte.
Et pour aider encore plus, sortir la description des champs de la table en XML ou autres, pour l’importer rapidement dans l’analyse.
PS : j’ai banni la jauge, elle multiplie le traitement par 3.
A+.Cliquez pour agrandir...
ops! j'ai pas pu attendre j'ai testé ton apli sur mon fichier et j'ai u un message d'erreur !!

Erreur à la ligne 75 du traitement Clic sur BTN_IMPORTER.
Vous avez appelé la méthode Automation 'End'.
Erreur 80010001
----- Informations techniques -----
Projet : ImpXLS_XXL
Appel WL :
Traitement de 'Clic sur BTN_IMPORTER' (FEN_HOME.BTN_IMPORTER), ligne 75, thread 0
Que s'est-il passé ?
Vous avez appelé la méthode Automation 'End'.
Erreur 80010001
Code erreur : 2205
Niveau : erreur fatale
Dump de l'erreur du module 'wd220vm.dll' (22.0.318.0).
Identifiant des informations détaillées (.err) : 130001
Informations supplémentaires :
EIT_PILEWL :
Clic sur BTN_IMPORTER (FEN_HOME.BTN_IMPORTER), ligne 75
EIT_DATEHEURE : 25/11/2018 22:31:09
EIT_TYPE_WDFILE : <2>
EIT_IDCODE : <18>