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