Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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
Bonjour,
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)
Hors ligne
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
// 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 :
// 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
?
Hors ligne
Bonjour,
J'ai finalement utilisé la solution For...Next , puisque notamment c'est celle que j'avais commencé à coder
// 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.
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
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
Hors ligne
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
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
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...
Hors ligne
Effectivement avec
::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