Macros

    From The Document Foundation Wiki


    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