25. Automatisation avec les données Excel

Lorsque des données sont fournies à Excel, vous pouvez utiliser les fonctions UpdateChart et PresentationFromTemplate pour contrôler de manière programmée à l’aide de ces données.

Avec UpdateChart vous échangez la feuille de données d’un élément spécifique contre vos données Excel. Avec PresentationFromTemplate, vous utilisez vos données pour créer une nouvelle présentation basée sur un modèle PowerPoint comportant des éléments think-cell liés aux plages de données d’Excel, tel que décrit dans 21. Liaisons de données Excel.

Étant intégrée au modèle Office Automation, l’interface avec les deux fonctions est accessible avec tout langage permettant de programmer Office, tel que VBA (Visual Basic for Applications) ou C#. Voir Mise en route pour obtenir des instructions détaillées.

Le point d'entrée dans think-cell est l'objet complément think-cell, accessible via la collection Application.COMAddIns. Les appels à think-cell sont toujours à liaison tardive. Pour plus d'explications, reportez-vous à la base de connaissances de Microsoft :

Utilisation d’une association précoce et tardive dans Automation

Ainsi, le type de l'objet complément think-cell est simplement Object, et il n'existe aucune bibliothèque ou référence de types à ajouter. Il suffit d'acquérir l'objet pour être en mesure de l'appeler. Par exemple, dans VBA dans Excel :

Dim tcXlAddIn As Object 
Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object

Dans C#, vous pouvez effectuez des associations précoces en définissant la référence à l’objet complément think-cell comme étant dynamic. Il s’agit également du type déduit par le compilateur lorsque vous définissez la référence comme étant var, alors vous pouvez simplement écrire :

var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;

Ici, xlapp est une référence à un objet Excel.Application dans lequel think-cell est chargé.

25.1
Tableau de mise à jour
25.2
PrésentationdepuisModèle

25.1 Tableau de mise à jour

25.1.1 Signature

VBA
tcXlAddIn.UpdateChart( _ 
    target As Object, _ 
    strName As String, _ 
    rgData As Excel.Range, _ 
    bTransposed As Boolean _ 
)
C#
void tcXlAddIn.UpdateChart(
    object target,
    string strName,
    Excel.Range rgData,
    bool bTransposed
);

25.1.2 Description

Cette fonction met à jour tous les éléments dans target avec le nom strName avec les données contenues dans rgData. Pour assurer la bonne interprétation des données pour les graphiques, la plage rgData doit se conformer à la mise en page de leur feuille de données par défaut, ou sa version transposée, voir également Création d’un graphique à partir d’Excel et Adaptation de la disposition des données. L’utilisation de la version par défaut et transposée est indiquée en paramétrant bTransposed sur false ou true, respectivement. Pour les éléments autres que les graphiques, comme les tableaux, la valeur bTransposed est ignorée.

target doit être une Presentation ou une SlideRange, ou une Slide, un Master ou une CustomLayout unique.

Le nom strName ne tient pas compte de la casse. Il doit avoir été attribué au préalable dans PowerPoint à l’aide du contrôle de propriété Nom UpdateChart, tel que décrit dans 24. Présentation de l’automatisation.

Pour garantir le ciblage des éléments corrects, assurez-vous qu’ils sont les seuls éléments avec leur Nom UpdateChart configurés sur strName dans l’objet passé en tant que pres.

Si un élément ciblé est lié à une plage de données Excel lors de l'invocation de cette fonction, le lien est interrompu. Après quoi l’élément n'est plus lié à aucune plage Excel.

25.1.3 Exemples

Pour utiliser ces modèles, préparez une présentation tel que décrit dans 24. Présentation de l’automatisation, et enregistrez-la sous C:\Samples\UpdateChart\template.pptx.

VBA

Pour utiliser ce modèle, ajoutez-le à un module dans un classeur Excel.

Cela nécessite une référence vers la bibliothèque d’objets Microsoft PowerPoint 16.0 (voir Visual Basic for Applications pour plus de détails).

L’exécution de UpdateChart_Sample dans un classeur mettra à jour le graphique dans le modèle de présentation avec les données contenues dans la plage A1:D5 de sa première feuille.

Option Explicit 
 
Sub UpdateChart_Sample() 

    ' Get the range containing the new data 
    Dim rng As Excel.Range 
    Set rng = ActiveWorkbook.Sheets(1).Range("A1:D5") 

    ' Get the think-cell add-in object 
    Dim tcXlAddIn As Object 
    Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object 

    ' Get a PowerPoint instance. Hold on to this 
    ' object as long as you want to access the 
    ' generated presentations. There can only be a 
    ' single PowerPoint instance. If there is no 
    ' PowerPoint running, one will be started. 
    ' Otherwise the existing one is used.

    Dim ppapp As Object 
    Set ppapp = New PowerPoint.Application 

    Dim pres As PowerPoint.Presentation 

    ' PowerPoint window visible 
    ' Set pres = ppapp.Presentations.Open( _ 
    '  Filename:="C:\\Samples\\UpdateChart\\template.pptx", _
    '  Untitled:=msoTrue) 

    ' PowerPoint window invisible 

    Set pres = ppapp.Presentations.Open( _
    Filename:="C:\\Samples\\UpdateChart\\template.pptx", _
    Untitled:=msoTrue, _
    WithWindow:=msoFalse)

    Call tcXlAddIn.UpdateChart(pres, "Chart1", rng, False) 

    ' Save the updated presentation 
    pres.SaveAs ("C:\\Samples\\UpdateChart\\template_updated.pptx") 
    pres.Close 

    ppapp.Quit 
End Sub

C#

Pour utiliser ce modèle, remplacez le code dans Program.cs du modèle de projet Console App C # par celui-ci

Cela nécessite une référence vers la bibliothèque d’objets Microsoft PowerPoint 16.0, la bibliothèque d’objets Microsoft Excel 16.0 et la bibliothèque d’objets Microsoft Ofice 16.0 (voir C# pour plus de détails).

L’exécution de l’application obtenue mettra à jour le graphique dans le modèle de présentation afin qu’il contienne une série unique nommée « Série 1 » avec les valeurs 1, 2, 3, et qu’il sauvegarde le résultat sous template_updated.pptx.

using Excel = Microsoft.Office.Interop.Excel;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core;

namespace ConsoleApplication_UpdateChart
{
    class Program
    {
        static void Main()
        {
            Excel.Application xlapp = new Excel.Application { Visible = true };

            Excel.Workbook workbook = xlapp.Workbooks.Add(1);
            Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets[1];
            worksheet.Cells[3, 1] = "Series 1";
            worksheet.Cells[3, 2] = 1;
            worksheet.Cells[3, 3] = 2;
            worksheet.Cells[3, 4] = 3;

            PowerPoint.Application ppapp = new PowerPoint.Application();
            PowerPoint.Presentation presentation = ppapp.Presentations.Open(
                    "C:\\Samples\\UpdateChart\\template.pptx",
                    Office.MsoTriState.msoFalse,
                    Office.MsoTriState.msoTrue
            );

            var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
            tcXlAddIn.UpdateChart(
                presentation,
                "Chart1",
                worksheet.get_Range("A1", "D3"),
                false
            );

            presentation.SaveAs("C:\\Samples\\UpdateChart\\template_updated.pptx");
            presentation.Close();
            ppapp.Quit();

            workbook.Close(false);
            xlapp.Quit();
        }
    }
}

25.2 PrésentationdepuisModèle

25.2.1 Signature

VBA
tcXlAddIn.PresentationFromTemplate( _ 
    wb As Excel.Workbook, _ 
    strTemplate As String, _ 
    ppapp As PowerPoint.Application _ 
) As PowerPoint.Presentation
C#
PowerPoint.Presentation tcXlAddIn.PresentationFromTemplate(
    Excel.Workbook wb,
    string strTemplate,
    PowerPoint.Application ppapp
);

25.2.2 Description

Cette fonction utilise des liaisons de données entre le classeur Excel wb et le modèle comportant le nom du fichier strTemplate pour créer le modèle en mettant à jour les éléments liés avec les données provenant des plages auxquelles ils sont liés. Il en résulte une nouvelle présentation dans l'instance PowerPoint ppapp.

strTemplate peut être un chemin complet ou un chemin relatif qui est alors indiqué par rapport à l'emplacement du fichier du classeur Excel wb.

Tous les éléments dans strTemplate liés au classeur Excel wb sont mis à jour (que l'option de mise à jour automatique soit activée ou non). Dans la présentation obtenue, leurs liaisons de données sont interrompues afin d’éviter toute autre modification de ces éléments.

Les éléments dans strTemplate qui sont liés à des classeurs Excel autres que wb ne sont pas modifiés et restent liés. Il est donc possible de mettre à jour des liaisons à partir de plusieurs classeurs Excel, en enregistrant le résultat de cette fonction en tant que nouveau modèle et en la rappelant avec le classeur suivant.

Si vous souhaitez contrôler les couleurs des segments du graphique ou le format des cellules du tableau avec le lien Excel, vous pouvez définir le jeu de couleurs sur Utiliser le remplissage de la feuille de données en superposition (voir Jeu de couleurs) ou les options Utiliser la feuille de données… (voir Mise en forme d’un tableau), respectivement. De même, pour contrôler le format des nombres avec la liaison Excel, activez l'option Utiliser le format Excel (voir Format des nombres).

Veillez à définir les options de formatage pertinentes et le format des nombres des cellules respectives dans Excel avant d'appeler PresentationFromTemplate.

25.2.3 Exemples

Pour utiliser ces modèles, créez tout d’abord une présentation avec un graphique empilé lié à la plage G1:K4 de la première feuille dans un classeur Excel, tel que décrit dans Création d’un graphique à partir d’Excel. Enregistrez dans le même répertoire la présentation obtenue sous C:\Samples\PresentationFromTemplate\template.pptx, et le classeur sous data.xlsx.

VBA

Pour utiliser ce modèle, ajoutez-le à un module dans le classeur Excel data.xlsx préparé, tel que décrit ci-dessus.

Cela nécessite une référence vers la bibliothèque d’objets Microsoft PowerPoint 16.0 (voir Visual Basic for Applications pour plus de détails).

L’exécution de PresentationFromTemplate_Sample modifiera la valeur de la cellule Sheet1!H3, qui est liée à la première valeur de la première série du graphique contenu dans template.pptx, de i=1 à 10, créera une nouvelle présentation avec le graphique dans le modèle mis à jour afin qu’il contienne cette valeur, et qu’elle ne soit plus liée au classeur, puis l’enregistrera sous output_i.pptx dans le même dossier que le modèle.

Option Explicit

Sub PresentationFromTemplate_Sample()
    ' Get the range to modify. It is more efficient
    ' to do this once rather than within the loop.
    Dim rng As Excel.Range
    Set rng = ActiveWorkbook.Sheets(1).Cells(3, 8)

    ' Get the think-cell add-in object
    Dim tcXlAddIn As Object
    Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object

    ' Get a PowerPoint instance. Hold on to this
    ' object as long as you want to access the
    ' generated presentations. There can only be a
    ' single PowerPoint instance. If there is no
    ' PowerPoint running, one will be started.
    ' Otherwise the existing one is used.
    Dim ppapp As Object
    Set ppapp = New PowerPoint.Application

    Dim i As Integer
    For i = 1 To 10
        ' Modify the range value.
        ' Note: Avoid selecting the cell prior to
        ' changing it. It is very slow and has
        ' undesirable side-effects.
        ' BAD:
        ' rng.Select
        ' ActiveWindow.Selection.Value = 0
        ' GOOD:
        rng.Value = i

        ' Generate a new presentation based on the
        ' linked template.
        Dim pres As PowerPoint.Presentation
        Set pres = tcXlAddIn.PresentationFromTemplate( _
            Excel.ActiveWorkbook, "template.pptx", ppapp _
        )

        ' If you want to modify the new presentation
        ' before saving it this is the place to do it.
        
        ' Save the new presentation
        pres.SaveAs "C:\Samples\PresentationFromTemplate\output_" & i & ".pptx"
        
        ' Explicitly close the presentation when we
        ' are done with it to free its memory.
        ' Letting the object go out of scope is not
        ' sufficient.
        pres.Close
    Next
End Sub

C#

Pour utiliser ce modèle, remplacez le code dans Program.cs du modèle de projet Console App C # par celui-ci

Cela nécessite une référence vers la bibliothèque d’objets Microsoft PowerPoint 16.0, la bibliothèque d’objets Microsoft Excel 16.0 et la bibliothèque d’objets Microsoft Ofice 16.0 (voir C# pour plus de détails).

L’exécution de l’application obtenue ouvrira Excel, chargera le classeur data.xlsx, modifiera la valeur de la cellule H3, qui est liée à la première valeur de la première série du graphique contenu dans template.pptx, de i=1 à 10, créera une nouvelle présentation avec le graphique dans le modèle mis à jour afin qu’il contienne cette valeur, et qu’elle ne soit plus liée au classeur, puis l’enregistrera sous output_i.pptx dans le même dossier que le modèle.

using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApplication_PresentationFromTemplate
{
    class Program
    {
        static void Main()
        {
            var xlapp = new Excel.Application { Visible = true };
            var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
            var workbook = xlapp.Workbooks.Open("C:\\Samples\\PresentationFromTemplate\\data.xlsx");
            var ppapp = new PowerPoint.Application();
            for (var i = 1; i <= 10; ++i)
            {
                workbook.Sheets[1].Cells[3, 8] = i;

                PowerPoint.Presentation presentation = tcXlAddIn.PresentationFromTemplate(
                    workbook,
                    "C:\\Samples\\PresentationFromTemplate\\template.pptx",
                    ppapp
                );

                presentation.SaveAs("C:\\Samples\\PresentationFromTemplate\\output" + i + ".pptx");
                presentation.Close();
            }
            ppapp.Quit();
            workbook.Close(false);
            xlapp.Quit();
        }
    }
}

Partager