Macros

From The Document Foundation Wiki
Jump to: navigation, search

Récupérer la table de données d'un diagramme

Le programme présenté ici a pour objet de récupérer la table de données source d'un diagramme incorporé dans un document (writer par exemple). Il travaille à partir de la sélection courante (qui doit donc être le diagramme à traiter) et recopie les données dans un nouveau classeur.

Dans l'interface (cf. la copie d'écran ci-dessous) les en-têtes de colonne (noms des séries de données : contrebasse, saxo alto, etc.) sont saisis et présentés sur une seule ligne. Le classeur généré reprendra cette présentation.

L'interface permet en revanche la saisie de plusieurs catégories dans différentes colonnes (cf. la copie d'écran ci-dessous). Le classeur généré reprendra également cette présentation.

copie d'écran
Table de données d'un diagramme dans Writer

Le programme commence par accéder à l'objet incorporé (le diagramme) pour obtenir ses données. Les différentes valeurs figurent dans des tableaux : ComplexRowDescriptions, ColumnDescriptions, Data[1].

Seule particularité : passage par une variable de travail (LibOTrav) pour affecter à la plage des en-têtes de colonnes le tableau ColumnDescriptions. En effet, la propriété FormulaArray d'une plage sera (pour 3 colonnes x 1 ligne) un tableau T( 0 To 0 ) As object avec pour élément zéro un tableau du type :

Tableau : T( 0 To 2 ) As string  
(0) | string : "contrebasse"
(1) | string : "saxo"
(2) | string : "percu"

La propriété ColumnDescriptions sera quant à elle (pour 3 colonnes x 1 ligne) un tableau : T( 0 To 2 ) As string

Tableau : T( 0 To 2 ) As string  
(0) | string : "contrebasse"
(1) | string : "saxo"
(2) | string : "percu"

La propriété FormulaArray doit être affectée "d'un bloc" ; on ne peut pas affecter uniquement l'élément zéro comme on serait tenté de le faire. Une solution est de passer par un tableau "de travail" auquel on affecte ColumnDescriptions, ce qui permet ensuite d'affecter globalement ce tableau de travail à la propriété FormulaArray.

option explicit
'********************************************************************************
'This library is Copyright (C) 2012 Pierre-Yves Samyn, except otherwise indicated
'Purpose: Frame the selection or create an empty frame if no selection
'    This program is free software: you can redistribute it and/or modify
'    it under the terms of the GNU General Public License as published by
'    the Free Software Foundation, either version 3 of the License, or
'    (at your option) any later version.
'    This program is distributed in the hope that it will be useful,
'    but WITHOUT ANY WARRANTY; without even the implied warranty of
'    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'    GNU General Public License for more details.
'    You should have received a copy of the GNU General Public License
'    along with this program.  If not, see <http://www.gnu.org/licenses/>.
'********************************************************************************

Sub PysRecupChartData
dim LibODiag as object
dim LibOClass as object
dim LibOFeuille as object
dim LibOData as object
dim LibOPlage as object
dim LibONbCols as integer
dim LibOTrav(0)

' Gestion des erreurs de selection
on error goto PysRecupChartData_Err

LibODiag = thiscomponent.currentSelection(0)

' Services differents selon que diagramme dans writer, calc... 
if LibODiag.supportsService("com.sun.star.text.TextEmbeddedObject") or _
        LibODiag.supportsService("com.sun.star.drawing.OLE2Shape") then
        LibOData = LibODiag.embeddedObject.component.data

'http://api.libreoffice.org/common/ref/com/sun/star/frame/XComponentLoader.html    
        LibOClass = stardesktop.loadComponentFromUrl("private:factory/scalc", "_blank", 0, array())      
        
        LibOFeuille = LibOClass.sheets.getByIndex(0)
'http://api.libreoffice.org/common/ref/com/sun/star/chart/XComplexDescriptionAccess.html
        LibONbCols = ubound(LibOData.ComplexRowDescriptions(0,0))

        LibOPlage = LibOFeuille.getCellRangeByPosition(0, 1, LibONbCols, ubound(LibOData.data)+1)
        LibOPlage.FormulaArray = LibOData.ComplexRowDescriptions

        LibOTrav(0) = LibOData.ColumnDescriptions
        LibOPlage = LibOFeuille.getCellRangeByPosition(LibONbCols + 1, 0, _
                ubound(LibOData.ColumnDescriptions)+ LibONbCols + 1, 0)
        LibOPlage.FormulaArray = LibOTrav
        
        LibOPlage = LibOFeuille.getCellRangeByPosition(LibONbCols + 1, 1, _
                ubound(LibOData.data(0,0))+LibONbCols+1, ubound(LibOData.data)+1)
        LibOPlage.data = LibOData.data
else
        msgbox "Ne fonctionne pas pour cette sélection", 64, "Extraire les données d'un diagramme"
end if

PysRecupChartData_Exit:
end

PysRecupChartData_Err:
        msgbox "Ne fonctionne pas pour cette sélection", 64, "Extraire les données d'un diagramme"
resume PysRecupChartData_Exit

End Sub

Notes :

  1. Voir la documentation de l'API pour l'interface XComplexDescriptionAccess