25. Automatisierung mit Excel-Daten

Wenn Daten in Excel bereitgestellt werden, können Sie die Funktionen UpdateChart und PresentationFromTemplate verwenden, um die Verwendung dieser Daten programmatisch zu kontrollieren.

Mit UpdateChart ersetzen Sie das Datenblatt eines bestimmten Elements mit Ihren Excel Daten. Mit PresentationFromTemplate nutzen Sie Ihre Daten für die Erstellung einer neuen Präsentation, basierend auf einer PowerPoint-Vorlage, mit think-cell Diagrammen, die mit Datenbereichen in Excel, wie in 21. Excel-Datenlinks beschrieben, verknüpft sind.

Die Schnittstelle zu beiden Funktionen ist in das Office Automation Model integriert, sodass sie mit jeder Programmiersprache für Office (z. B. Visual Basic for Applications oder C#) aufgerufen werden kann. Eine ausführlichere Anleitung dazu finden Sie hier Erste Schritte.

Der Einstiegspunkt in think-cell ist das think-cell Add-In-Objekt. Dieses kann über die Application.COMAddIns-Sammlung aufgerufen werden. Aufrufe in think-cell sind immer spät gebunden. Eine Erklärung hierzu finden Sie in der Microsoft Knowledge Base unter:

Frühes und spätes Binden bei Automatisierung verwenden

Der Typ des think-cell Add-In-Objekts ist somit einfach Object, und es muss keine Typenbibliothek oder Referenz hinzugefügt werden. Sobald Sie sich das Objekt abgerufen haben, können Sie es aufrufen. In VBA in Excel:

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

In C# können Sie spätes Binden erzielen, indem Sie die Referenz auf das think-cell Add-In-Objekt als dynamic deklarieren. Dies ist auch der vom Compiler gefolgerte Typ, wenn die Referenz als var deklariert wird, sodass Sie einfach Folgendes schreiben können:

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

Hier ist xlapp eine Referenz auf ein Excel.Application Objekt, in dem think-cell geladen wird.

25.1
DiagrammAktualisieren
25.2
PräsentationAusVorlage

25.1 DiagrammAktualisieren

25.1.1 Unterschrift

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 Beschreibung

Diese Funktion aktualisiert alle Elemente in target mit dem Namen strName mit den Daten aus rgData. Damit die Daten für Diagramme korrekt interpretiert werden, muss der Bereich rgData seinem Standard-Datenblatt-Layout oder seiner transponierten Version entsprechen, siehe hierzu auch Erstellen eines Diagramms aus Excel und Anpassen des Datenlayouts. Ob die standardmäßige oder transponierte Version verwendet werden soll, wird von der Einstellung bTransposed zu false oder true angegeben. Für Elemente, bei denen es sich nicht um Diagramme handelt, z. B. Tabellen, wird der Wert bTransposed ignoriert.

target muss ein Presentation oder SlideRange, oder ein einzelnes Slide, Master oder CustomLayout sein.

Beim Namen strName wird nicht zwischen Groß- und Kleinschreibung unterschieden. Er muss zuvor mithilfe der Eigenschaft UpdateChart-Name in PowerPoint zugewiesen worden sein, wie beschrieben in 24. Einführung in die Automatisierung.

Um sicherzustellen, dass die richtigen Elemente bestimmt werden, stellen Sie sicher, dass sie die einzigen sind, bei denen der UpdateChart-Name auf strName im als pres übergebenen Objekt eingestellt ist.

Ist das Element mit einem Excel-Datenbereich verknüpft, wenn die Funktion aufgerufen wird, wird die Verknüpfung getrennt. Anschließend besteht keine Verknüpfung zwischen dem Element und dem Excel-Bereich mehr.

25.1.3 Beispiele

Um diese Beispiele zu verwenden, bereiten Sie wie in 24. Einführung in die Automatisierung beschrieben eine Präsentation vor und speichern Sie sie als C:\Samples\UpdateChart\template.pptx.

VBA

Um dieses Beispiel zu verwenden, fügen Sie es zu einem Modul in einer Excel-Arbeitsmappe hinzu.

Dies erfordert eine Referenz zum Microsoft PowerPoint 16.0 Objektverzeichnis (siehe Visual Basic for Applications für weitere Informationen).

Das Ausführen von UpdateChart_Sample in einer Arbeitsmappe aktualisiert das Diagramm in der Präsentationsvorlage mit den in Bereich A1:D5 enthaltenen Daten der ersten Tabelle.

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#

Um dieses Beispiel zu verwenden, ersetzen Sie den Code in Program.cs der C# Console App Projektvorlage damit.

Dies erfordert eine Referenz zum Microsoft PowerPoint 16.0 Objektverzeichnis, dem Microsoft Excel 16.0 Objektverzeichnis und dem Microsoft Office 16.0 Objektverzeichnis (siehe C# für weitere Informationen).

Das Ausführen der resultierenden Anwendung aktualisiert die Tabelle in der Präsentationsvorlage, sodass sie eine einzelne Serie namens „Serie 1“ mit den Werten 1, 2, 3 enthält. Das Ergebnis wird als template_updated.pptx gespeichert.

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äsentationAusVorlage

25.2.1 Unterschrift

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 Beschreibung

Diese Funktion nutzt die Datenverknüpfungen zwischen der Excel-Arbeitsmappe wb und der Vorlage mit dem Dateinamen strTemplate, um die Vorlage zu instantiieren, indem die verknüpften Elemente mit den Daten aus den damit verknüpften Bereichen aktualisiert werden. Das Ergebnis ist eine neue Präsentation innerhalb der PowerPoint-Instanz ppapp.

strTemplate kann entweder ein vollständiger oder relativer Pfadname sein. Der relative Pfadname ist relativ zum Ort der Excel-Arbeitsmappendatei wb.

Alle Elemente in strTemplate, die mit der Excel-Arbeitsmappe wb verknüpft sind, werden aktualisiert (egal ob sie auf automatische Aktualisierung eingestellt sind oder nicht). Anschließend werden in der Präsentation ihre Datenverknüpfungen getrennt, um weitere Veränderungen dieser Elemente zu verhindern.

Elemente in strTemplate, die mit anderen Excel-Arbeitsmappen als wb verknüpft sind, bleiben unverändert und verknüpft. Es ist also möglich, Verknüpfungen mehrerer Excel-Arbeitsmappen zu aktualisieren, indem man das Ergebnis dieser Funktion als neue Vorlage speichert und die Funktion dann mit der nächsten Arbeitsmappe aufruft.

Falls Sie die Farben von Diagrammsegmenten oder die Formatierung von Tabellenzellen mit der Excel-Verknüpfung steuern möchten, können Sie für das Farbschema die Option Datenblatt-Füllung überlagern einstellen (siehe Farbschema) oder die Option Datenblatt verwenden… (siehe Formatieren einer Tabelle) verwenden. Um ebenso das Zahlenformat bei der Excel-Verknüpfung zu steuern, setzen Sie es auf Excel-Format verwenden (siehe Zahlenformat).

Stellen Sie sicher, dass Sie die entsprechenden Formatierungsoptionen und das Zahlenformat der entsprechenden Zellen in Excel eingestellt haben, bevor Sie PresentationFromTemplate aufrufen.

25.2.3 Beispiele

Um diese Beispiele zu verwenden, erstellen Sie zunächst eine Präsentation mit einem gestapelten Diagramm, das mit Bereich G1:K4 der ersten Tabelle in einer Excel-Arbeitsmappe verknüpft ist, wie in Erstellen eines Diagramms aus Excel beschrieben. Speichern Sie die Präsentation als C:\Samples\PresentationFromTemplate\template.pptx und die Arbeitsmappe als data.xlsx im gleichen Ordner.

VBA

Um dieses Beispiel zu verwenden, fügen Sie es zu einem Modul in der Excel-Arbeitsmappe data.xlsx wie oben beschrieben hinzu.

Dies erfordert eine Referenz zum Microsoft PowerPoint 16.0 Objektverzeichnis (siehe Visual Basic for Applications für weitere Informationen).

Das Ausführen von PresentationFromTemplate_Sample ändert den Wert in Zelle Sheet1!H3, die mit dem ersten Wert der ersten Serie der Tabelle aus template.pptx verknüpft ist, von i=1 auf 10, erstellt eine neue Präsentation mit dem Diagramm in der aktualisierten Vorlage mit diesem Wert, das nicht mehr mit der Arbeitsmappe verknüpft ist, und speichert diese als output_i.pptx im gleichen Verzeichnis wie die Vorlage.

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#

Um dieses Beispiel zu verwenden, ersetzen Sie den Code in Program.cs der C# Console App Projektvorlage damit.

Dies erfordert eine Referenz zum Microsoft PowerPoint 16.0 Objektverzeichnis, dem Microsoft Excel 16.0 Objektverzeichnis und dem Microsoft Office 16.0 Objektverzeichnis (siehe C# für weitere Informationen).

Das Ausführen der Anwendung öffnet sichtbar Excel, lädt die Arbeitsmappe data.xlsx, ändert den Wert in Zelle H3, die mit dem ersten Wert der ersten Serie der Tabelle aus template.pptx verknüpft ist, von i=1 auf 10, erstellt eine neue Präsentation mit dem Diagramm in der aktualisierten Vorlage mit diesem Wert, das nicht mehr mit der Arbeitsmappe verknüpft ist, und speichert diese als output_i.pptx im gleichen Verzeichnis wie die Vorlage.

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();
        }
    }
}

Teilen