Répétez apres moi :J'aime PBAdonf. J'aime PBAdonf. J'aime PBAdonf.

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.
  • Index
  •  » Powerscripts
  •  » [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

#1 19-12-2011 15:38:57

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

[RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

Bonjour,

J'ai un classeur Excel ouvert avec l'ole excel, avec plusieurs feuilles, et je veux sauvegarder une datastore sur chacune des feuilles.

Je sais en fonction du nom de la feuille, quelle datastore je dois sauvegarder.

Mais y-a-t-il une méthode 'rapide' du genre saveas pour sauvegarder chaque datastore sur chacune des feuilles excel ?

Pour le moment, la solution que j'ai trouvé est de parcourir chaque ds, et d'écrire ligne à ligne et colonne par colonne des valeurs de la datastore dans la feuille excel, mais il doit bien exister un meilleur moyen ?

Merci d'avance de votre retour,



Pb version 9.0

Hors ligne

 

#2 19-12-2011 16:06:57

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

Bonjour,

Code: pb

string ls_lastclipboard
ls_lastclipboard = clipboard(ds_tmp.describe("datawindow.data"))
oleXls.Object.ActiveSheet.Paste
clipboard(ls_lastclipboard)


Bon ok, c'est un peu du "raw" copy mais ça a le mérite d'être fait en peu de ligne de code

Dernière modification par xlat (19-12-2011 16:16:28)


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#3 19-12-2011 16:07:15

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

Salut,

Dans ton cas, le plus rapide je pense est de faire tous les dw.saveas "classiques" dans N fichiers temporaires et de déplacer les feuilles dans un seul fichier via OLE.

Edit :

xlat a écrit:

Bonjour,

Code: pb

string ls_lastclipboard
ls_lastclipboard = clipboard(ds_tmp.describe("datawindow.data"))
oleXls.Object.ActiveSheet.Paste
clipboard(ls_lastclipboard)


Bon ok, c'est un peu du "raw" copy mais ça à le mérite d'être fait en peut de ligne de code

+1, clipboard me disait qq chose...
dans l'autre sens : http://pbadonf.fr/forum/viewtopic.php?pid=26711#p26711

Code: pb

// Positionnement sur la bonne feuille et sélection du contenu
loo_excel.ActiveWorkbook.Sheets(li_index).Select
loo_excel.ActiveCell.CurrentRegion.Select
loo_excel.Selection.Copy()

// Importation des données à partir de la 2nde ligne copiée dans la dw passée en paramètre
ll_rc = adw_datawindow.ImportClipBoard (2)



Au passage, ça donne quoi un benchmark entre dw.saveas et : 

Code: pb

// Loop thru the Datawindow and Excel sheet
// The for/next loop copies all rows for each column
For c = 1 to numcols
For r = 1 to numrows
xlsub.cells[r,c] = dw_1.object.data[r,c]

Next
Next


?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#4 20-12-2011 13:52:49

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

Bonjour,

J'ai finalement utilisé la solution For...Next , puisque notamment c'est celle que j'avais commencé à coder

Code: pb

// Loop thru the Datawindow and Excel sheet
// The for/next loop copies all rows for each column
For c = 1 to numcols
For r = 1 to numrows
xlsub.cells[r,c] = dw_1.object.data[r,c]

Next
Next


Et que la solution clipboard ci dessous ne fonctionne pas, le string ls_lastclipboard est égal à '' avec la syntaxe ci dessous.

Code: pb

string ls_lastclipboard
ls_lastclipboard = clipboard(ds_tmp.describe("datawindow.data"))
oleXls.Object.ActiveSheet.Paste
clipboard(ls_lastclipboard)


Et j'ai bien utilisé la solution ImportClipBoard pour importer toutes les feuilles d'un classeur Excel, qui fonctionne très bien et méthode très très rapide en execution.
Il faut simplement faire attention, car la datastore dans laquelle est importer les feuilles contient également des lignes vides (en fonction de ce qui a été fait dans le fichier excel), donc attention si besoin de faire un update de la datastore, il faut supprimer les lignes vides avant.


J'ai un dernier problème sur ces feuilles importées, lorsque la colonne de la datastore est de format décimal et dans le fichier Excel, la colonne a le séparateur de milliers() de cocher. Dans ce cas, l'importation ne peut se faire, il faut donc que je trouve une solution pour les colonnnes de type décimal de décocher cet indicateur avant de commencer l'importation.

Avez-vous une idée ?

Merci

Hors ligne

 

#5 20-12-2011 14:22:44

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

wazou1812 a écrit:

Et que la solution clipboard ci dessous ne fonctionne pas, le string ls_lastclipboard est égal à '' avec la syntaxe ci dessous.

Code: pb

string ls_lastclipboard
ls_lastclipboard = clipboard(ds_tmp.describe("datawindow.data"))
oleXls.Object.ActiveSheet.Paste
clipboard(ls_lastclipboard)

C'est que... comment dire... clipboard retourne la valeur du presse papier precedente, ce qui permet de ne pas vautrer d'autres algos qui l'utiliseraient... (non je ne pense pas en particulier à l’auto complétion de l'IDE...non pas du tout hein...) d'où aussi le nom de la variable ls_lastclipboard


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#6 20-12-2011 14:26:17

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

xlat a écrit:

wazou1812 a écrit:

Et que la solution clipboard ci dessous ne fonctionne pas, le string ls_lastclipboard est égal à '' avec la syntaxe ci dessous.

Code: pb

string ls_lastclipboard
ls_lastclipboard = clipboard(ds_tmp.describe("datawindow.data"))
oleXls.Object.ActiveSheet.Paste
clipboard(ls_lastclipboard)

C'est que... comment dire... clipboard retourne la valeur du presse papier precedente, ce qui permet de ne pas vautrer d'autres algos qui l'utiliseraient... (non je ne pense pas en particulier à l’auto complétion de l'IDE...non pas du tout hein...) d'où aussi le nom de la variable ls_lastclipboard

Et si je mets , avant

Code: pb

clipboard('')


Dans ce cas la valeur ls_lastclipboard est vide,  apparemment, il ne peut mettre le contenu de la datastore dans le copier/coller.

Et une idée pour mon autre question, sur le format des colonnes ?

Merci

Hors ligne

 

#7 20-12-2011 15:04:16

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

wazou1812 a écrit:

Et si je mets , avant

Code: pb

clipboard('')


Dans ce cas la valeur ls_lastclipboard est vide,  apparemment, il ne peut mettre le contenu de la datastore dans le copier/coller.

Ben clipboard() n'est pas censé faire ce que tu dis :
- soit tu l'appelles avec un paramètre, et dans ce cas ce que tu lui donnes remplace le contenu actuel du presse papiers
- soit tu l'appelles sans paramètre et tu récupère le contenu du presse papier

Dans tous les cas, la valeur retournée est le contenu précédent.

Donc ton clipboard('') mémorise une chaîne vide dans le presse-papiers, il est normal que le clipboard(ds_tmp.describe("datawindow.data")) suivant te retourne une chaine vide (par cotre après cela il devrait y avoir les données de ta DW.

Maintenant, est-ce que tu appelles clipboard() dans une datawindow ou un datastore ? Parce qu'il y a un piège : il faut appeler ::clipboard() (avec les "::")

En passant, pour aider avec la gestion du presse papier, il est possible de visualiser con contenu avec un outil interne de windows : clipbrd.exe, autement je recommende vivement Clipboard Viewer de Georges Dumond sur CodeGuru, un outil très pratique qui permet même de visualiser le presse papier en hexadécimal et dont les sources sont fournies.

wazou1812 a écrit:

Et une idée pour mon autre question, sur le format des colonnes ?

Je soupçonne un problème de séparateur décimal : point contre virgule... il faut peut-être que tu remplaces l'un par l'autre ?

xlat me souffle dans l'oreillette que c'est peut-être dû aux espaces dans les formats d'excel, il faudrait traiter le contenu du presse-papier pour les retirer, ou du côté excel, copier les valeurs sans formatage...


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#8 20-12-2011 16:03:40

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

Effectivement avec

Code: pb

::clipboard


cela fonctionne mieux, mais malheureusement le paste dans le fichier Excel de plusieurs lignes et plusieurs colonnes, Excel n'aime pas du tout, donc je laisse tomber cette solution, et e garde la solution for  next sur les lignes et les colonnes.

Et pour mon autre problème, dans Excel,

les zones avec un séparateur ont ce type de format Selection.NumberFormat = "#,##0.0000"  (avec 4 décimales)

et celle qui n'ont pas le séparateur sont comme cela Selection.NumberFormat = "0.0000"

Il faut donc avant la commande ImportClipBoard (2)  de chacune des feuilles, que je parcours la feuille avec l'OLE afin de repérer les colonnes susceptibles de me poser problème, car ces zones sont importées dans une datastore avec une zone définie en décimal(2) ou décimal(4) dans le but de faire update sur la datastore.
Malheureusement, le format Excel mets un blanc pour séparer les milliers, ce qui ne peut être accepté par la dw lors de l'import.

Hors ligne

 
  • Index
  •  » Powerscripts
  •  » [RESOLU] Ecrire le contenu d'une datastore dans une feuille excel

Pied de page des forums

Propulsé par FluxBB 1.2.22