Macros
TDF LibreOffice Document Liberation Project Blogs communautaires Weblate Nextcloud Redmine Ask LibreOffice Donner
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.
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 :
- ↑ Voir la documentation de l'API pour l'interface XComplexDescriptionAccess