使用 Excel 数据实现自动化

在 Windows 上,你可以使用 thinkcell API 函数,以编程方式利用 Excel 中的数据创建 thinkcell 演示文稿。

Excel 数据自动化简介

仅限 Windows

当你需要定期生成大型报告,而不想每次都手动更新数据时,Excel 自动化最有帮助。对于较小或临时的图表制作任务,我们建议使用 Excel 数据链接。

要创建 PowerPoint 模板的副本,并更新复制后演示文稿中所有链接到 Excel 工作簿的 thinkcell 元素(请参阅 Excel 数据链接),请使用 PresentationFromTemplate 函数。

要更新 PowerPoint 模板中的特定 thinkcell 元素,无论它们是否链接到 Excel,请使用 UpdateBatch API。UpdateBatch 已取代 UpdateChart(已弃用)。不过,如果你现有代码使用 UpdateChart,该代码仍可正常运行。

thinkcell API 与 Office 自动化

thinkcell API 集成在 Microsoft 的组件对象模型 (COM) 中,因此你可以从任何可用于 Office 编程的语言访问该 API,例如 Visual Basic for Applications (VBA) 或 C#。有关如何使用 VBA 和 C# 的说明,请参阅 开始使用 thinkcell API。

thinkcell 的入口点是 thinkcell 加载项对象。你可以通过 Application.COMAddIns 集合访问该对象。对 thinkcell 的调用始终采用后期绑定(请参阅 Microsoft Learn)。因此,thinkcell 加载项对象的类型只是 Object,你无需添加任何类型库或引用。获取该对象后,即可进行调用。例如,在 Excel 的 VBA 中,使用以下代码:

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

在 C# 中,你可以通过将 thinkcell 加载项对象的引用声明为 dynamic 来实现后期绑定。当你将引用声明为 var 时,编译器会推断该对象的类型为 dynamic,因此你可以直接使用以下代码。这里,xlapp 是对加载 thinkcell 的 Excel.Application 对象的引用。

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

匹配 Excel 与模板的数据布局

要在对应图表中正确显示数据,Excel 中的数据布局必须与模板中图表的数据表布局匹配(请参阅 转置并编辑链接范围的数据布局)。例如,如果你在模板图表中添加 100%= 行,thinkcell 会将 Excel 数据的第二行解释为用于计算百分比的总计值。

下表汇总了常见的数据布局选项、它们在数据布局中的位置以及默认设置。要检查特定图表的数据布局,请双击该图表以打开其数据表。

数据布局选项

内容

位置

默认设置

Series

系列标签

第 1 列

已选中

Category

类别标签

第 1 行

已选中

100%=

用于百分比计算的总计值

第 2 行(如果已选中 Category)
第 1 行(如果未选中 Category)

未选中

将元素格式与 Excel 匹配

你可以将元素的格式(例如数字格式、填充和字体颜色)与 Excel 工作簿中的格式匹配。在调用 PresentationFromTemplate 或 UpdateBatch 之前,请在 Excel 工作簿中应用所需格式。然后,在 PowerPoint 模板中,将元素的数字格式、字体格式、填充或边框与 Excel 工作簿匹配(请参阅 使元素格式与链接的数据范围匹配)。

PresentationFromTemplate

仅限 Windows

PresentationFromTemplate 函数会创建 PowerPoint 模板的副本,并更新复制后演示文稿中所有链接到 Excel 工作簿的 thinkcell 元素。有关已链接 thinkcell 元素的更多信息,请参阅 Excel 数据链接。

PresentationFromTemplate 签名

VBA

tcXlAddIn.PresentationFromTemplate( _ 
	Workbook As Excel.Workbook, _ 
	Template As String, _ 
	PpApplication As PowerPoint.Application _ 
) As PowerPoint.Presentation

C#

PowerPoint.Presentation tcXlAddIn.PresentationFromTemplate(
	Excel.Workbook Workbook,
	string Template,
	PowerPoint.Application PpApplication
);

PresentationFromTemplate 说明

PresentationFromTemplate 接受以下参数:

  • Workbook 指包含数据的 Excel 工作簿。
  • Template 指包含要用数据填充的元素的 PowerPoint 模板。要用数据填充元素,该元素必须链接到 Workbook 中的某个范围(请参阅 Excel 数据链接)。Template 可以指定相对于 Workbook 所在位置的相对路径,也可以指定绝对路径。
  • PpApplication 指生成新演示文稿的 PowerPoint 实例。

PresentationAsTemplate 会创建 Template 的副本,并更新复制后演示文稿中所有链接到 Workbook 的元素,无论你是否已将这些元素设置为自动更新(请参阅 管理已链接元素中的数据)。

在新演示文稿中,PresentationFromTemplate 会有意断开已更新元素的 Excel 链接,以防止后续意外更新。不过,该函数未更新的元素会保留其 Excel 链接。这意味着你可以从多个 Excel 工作簿更新链接。为此,在创建新演示文稿后,再次使用下一个工作簿调用 PresentationFromTemplate,并将刚创建的演示文稿用作模板。

PresentationFromTemplate 示例

要使用这些示例,请先创建一个演示文稿,其中包含一个链接到 Excel 工作簿第一个工作表中 G1:K4 范围的堆积柱形图(请参阅 从 Excel 创建图表)。将演示文稿保存为 C:\Samples\PresentationFromTemplate\template.pptx,并将工作簿保存为同一目录中的 data.xlsx。

VBA

在此示例中,在 Sheet1 中,过程 PresentationFromTemplate_Sample() 将 H3 的值从 i=1 更改为 10。H3 链接到堆积柱形图第一个系列中的第一个值。对于 H3 的每个新值,PresentationFromTemplate_Sample() 会执行以下操作:

  1. 复制 template.pptx。
  2. 在复制后的演示文稿中,使用新值更新图表。
  3. 断开图表的 Excel 链接。
  4. 在与模板相同的目录中,将新演示文稿保存为 output_i.pptx。

要使用此示例,请在你之前创建的 Excel 工作簿 data.xlsx 中,创建一个包含以下过程的模块。该模块需要引用 Microsoft PowerPoint 16.0 Object Library(请参阅 Visual Basic for Applications)。

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 thinkcell 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 start.
	' 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#

在此示例中,程序会打开 Excel 并加载 data.xlsx。然后,在 Sheet1 中,程序将 H3 的值从 i=1 更改为 10。H3 链接到堆积柱形图第一个系列中的第一个值。对于 H3 的每个新值,程序会执行以下操作:

  1. 复制 template.pptx。
  2. 在复制后的演示文稿中,使用新值更新图表。
  3. 断开图表的 Excel 链接。
  4. 在与模板相同的目录中,将新演示文稿保存为 output_i.pptx。

要使用此示例,请在 C# Console App 项目模板中,将 Program.cs 中的代码替换为以下代码。该程序需要引用 Microsoft PowerPoint 16.0 Object Library、Microsoft Excel 16.0 Object Library 和 Microsoft Office 16.0 Object Library(请参阅 C#)。

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

UpdateBatch

仅限 Windows

使用 UpdateBatch API,你可以指定 PowerPoint 模板中哪些 thinkcell 元素将使用新的 Excel 数据进行更新。无论元素是否链接到 Excel,都可以更新。

UpdateBatch 已取代 UpdateChart(已弃用)。虽然使用 UpdateChart 的现有代码仍可正常运行,但我们建议改用 UpdateBatch,原因如下:

  • 新功能(例如使用 Excel 数据填充表格图像,请参阅 创建表格图像)仅在 UpdateBatch 中提供。
  • 在较新的 thinkcell 版本中,UpdateChart 可能非常慢,尤其是在大型演示文稿中。

UpdateBatch 签名

VBA

tcXlAddIn.CreateUpdate() As Object

tcUpdate.AddRangeData(
	Target As Object, _
	Name As String, _
	Range As Excel.Range, _
	Transposed As Boolean _
)

tcUpdate.AddRangeImage(
	Target As Object, _
	Name As String, _
	Range As Excel.Range _
)

tcUpdate.Send()

C#

object tcXlAddIn.CreateUpdate();

void tcUpdate.AddRangeData(
	object Target,
	string Name,
	Excel.Range Range,
	bool Transposed
);

void tcUpdate.AddRangeImage(
	object Target,
	string Name,
	Excel.Range Range
);

void tcUpdate.Send();

UpdateBatch 说明

UpdateBatch 包含以下函数:

  • CreateUpdate 创建一个对象,用于存储你要更新的所有元素及其对应的 Excel 数据范围。
  • AddRangeData 为你要用 Excel 数据填充的图表、表格、自动化文本字段、Harvey ball、复选框或图像安排更新。
  • AddRangeImage 为你要用 Excel 数据填充的表格图像安排更新(请参阅 创建表格图像)。
  • Send 收集 Excel 数据并将其发送到 PowerPoint 以创建演示文稿。如果你的代码以 PowerPoint 模板中链接到 Excel 的元素为目标,这些链接将被断开(请参阅 Excel 数据链接)。

AddRangeData 和 AddRangeImage 接受以下参数:

  • Target 指包含要用数据填充的元素的 PowerPoint 模板。Target 可以是 Presentation、SlideRange、Slide、Master 或 CustomLayout。
  • Name 指具有 AddRangeData 或 AddRangeImage 名称的元素。在运行 UpdateBatch 之前,必须在 PowerPoint 模板中使用 AddRangeData Name 或 AddRangeImage Name 分配名称(请参阅 为报告自动化创建 PowerPoint 模板)。名称不区分大小写。如果 Target 中的两个元素同名,thinkcell 会用相同的数据填充它们。
  • Range 指包含该元素数据的 Excel 区域。
  • Transposed(仅限 AddRangeData):如果 Excel 区域的方向与 PowerPoint 中该元素数据表的默认方向一致,请将 Transposed 设置为 False。否则,请将 Transposed 设置为 True。有关不同元素类型的参数值说明,请参阅下表。

元素类型

Transposed 值

除甘特图、散点图和气泡图以外的所有图表

False = 在元素数据表中,Range 中的行表示系列,列表示类别

True = 在元素数据表中,Range 中的列表示系列,行表示类别

表格

False = 表格布局与 Range 匹配

True = 表格布局相对于 Range 已转置

甘特图

False = 在元素数据表中,Range 中的行表示活动,列表示对应的锚点

True = 在元素数据表中,Range 中的列表示活动,行表示对应的锚点

散点图和气泡图

False = 在元素数据表中,Range 中的行表示数据点,列表示维度

True = 在元素数据表中,Range 中的列表示数据点,行表示维度

UpdateBatch 示例

以下 VBA 和 C# 代码示例会使用 Excel 工作簿第一个工作表中的数据更新 PowerPoint 模板中的三个元素。这些示例会将生成的演示文稿保存为 template_updated.pptx。

要使用这些示例,请创建一个包含 thinkcell 元素的 PowerPoint 模板,以及一个包含用于填充这些元素的数据的 Excel 工作簿。

要创建 PowerPoint 模板,请按以下步骤操作:

  1. 按照 PowerPoint 模板示例 中的说明,创建一个包含幻灯片标题和图表的 PowerPoint 演示文稿。
  2. 在演示文稿中,添加一个表格图片(请参阅 创建表格图像)。
  3. 打开表格的迷你工具栏。在 AddRangeImage Name 中,输入 TableAsImage1。选择 Enter。
  4. 将演示文稿保存到 C:\Samples\UpdateBatch\template.pptx。

要创建 Excel 工作簿,请按以下步骤操作:

  1. 打开一个 Excel 工作簿。
  2. 在 A1 中输入幻灯片标题。
  3. 在 A2:D5 中输入图表数据。确保 Excel 中的数据布局与 PowerPoint 模板中的图表数据表布局一致(请参阅 匹配 Excel 与模板的数据布局)。
  4. 在 A7:D10 中输入表格数据。您应用的任何表格格式(例如填充和边框)都会显示在新的演示文稿中。
  5. 将工作簿保存到 C:\Samples\UpdateBatch\data.xlsx。

在 UpdateBatch 过程指定路径时,请使用双反斜杠 (\\) 作为目录分隔符。

VBA

要使用此代码示例,请在之前创建的 Excel 工作簿中,创建一个包含以下过程的模块。该模块需要引用 Microsoft PowerPoint 16.0 Object Library。有关更多信息,请参阅 Visual Basic for Applications。

Option Explicit

Sub UpdateBatch_Sample()
	
	' Get the ranges that contain the new data
	Dim rngTitle As Excel.Range
	Set rngTitle = ActiveWorkbook.Sheets(1).Range("A1")
	Dim rngChart As Excel.Range
	Set rngChart = ActiveWorkbook.Sheets(1).Range("A2:D5")
	Dim rngTableAsImage As Excel.Range
	Set rngTableAsImage = ActiveWorkbook.Sheets(1).Range("A7:D10")

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

	' Get a PowerPoint instance. Hold onto this object as long as
	' you want to access the new presentation. There can only be one
	' PowerPoint instance. If there is no instance, the script will
	' start one. Otherwise, the script uses the existing instance.
	Dim ppapp As Object
	Set ppapp = New PowerPoint.Application

	Dim pres As PowerPoint.Presentation

	' When the script ends, this code opens the new presentation
	' so that you can edit it further. To keep the presentation open,
	' also remove pres.Close and ppapp.Quit.
	' Set pres = ppapp.Presentations.Open( _
	' 	Filename:="C:\\Samples\\UpdateBatch\\template.pptx", _
	' 	Untitled:=msoTrue _
	' )

	' When the script ends, this code does not open the new presentation.
	Set pres = ppapp.Presentations.Open( _
		Filename:="C:\\Samples\\UpdateBatch\\template.pptx", _
		Untitled:=msoTrue, _
		WithWindow:=msoFalse _
	)

	Dim tcUpdate As Object
	Set tcUpdate = tcXlAddIn.CreateUpdate
          
	Call tcUpdate.AddRangeData(pres, "Title", rngTitle, False)
	Call tcUpdate.AddRangeData(pres, "Chart1", rngChart, False)
	Call tcUpdate.AddRangeImage(pres, "TableAsImage1", rngTableAsImage)
	Call tcUpdate.Send

	pres.SaveAs("C:\\Samples\\UpdateBatch\\template_updated.pptx")
	pres.Close

	ppapp.Quit

End Sub

C#

要使用此代码示例,请在 C# Console App 项目模板中,将 Program.cs 中的代码替换为以下代码。

该程序需要引用 Microsoft PowerPoint 16.0 Object Library、Microsoft Excel 16.0 Object Library 和 Microsoft Office 16.0 Object Library。有关更多信息,请参阅 C#。

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

namespace ConsoleApplication_UpdateBatch
{
	class Program
	{
		static void Main()
		{
			
			PowerPoint.Application ppapp = new PowerPoint.Application();
			PowerPoint.Presentation presentation = ppapp.Presentations.Open(
				"C:\\Samples\\UpdateBatch\\template.pptx",
				Office.MsoTriState.msoFalse,
				Office.MsoTriState.msoTrue
			);
			
			Excel.Application xlapp = new Excel.Application { Visible = true };
			Excel.Workbook workbook = xlapp.Workbooks.Open(
				"C:\\Samples\\UpdateBatch\\data.xlsx",
				Office.MsoTriState.msoFalse,
				Office.MsoTriState.msoTrue
			);
			Excel.Worksheet worksheet = workbook.Sheets[1];
			
			var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
			var tcUpdate = tcXlAddIn.CreateUpdate();
			
			tcUpdate.AddRangeData(
				presentation,
				"SlideTitle",
				worksheet.get_Range("A1"),
				true
			);
			
			tcUpdate.AddRangeData(
				presentation,
				"Chart1",
				worksheet.get_Range("A2", "D5"),
				true
			);
			
			tcUpdate.AddRangeImage(
				presentation,
				"TableAsImage1",
				worksheet.get_Range("A7", "D10")
			);
			
			tcUpdate.Send();
			
			presentation.SaveAs("C:\\Samples\\UpdateBatch\\template_updated.pptx");
			presentation.Close();
			ppapp.Quit();
			
			workbook.Close(false);
			xlapp.Quit();
		}
	}
}

UpdateChart(已弃用)

仅限 Windows

UpdateChart 会使用您的 Excel 数据更新特定元素的数据表。

UpdateBatch 已取代 UpdateChart(请参阅 UpdateBatch)。虽然使用 UpdateChart 的现有代码仍可运行,但我们建议在新代码中改用 UpdateBatch,原因如下:

  • 新功能(例如使用 Excel 数据填充表格图像,请参阅 创建表格图像)仅在 UpdateBatch 中提供。
  • 在较新的 thinkcell 版本中,UpdateChart 可能非常慢,尤其是在大型演示文稿中。

UpdateChart 签名

VBA

tcXlAddIn.UpdateChart( _
	Target As Object, _
	ChartName As String, _
	Range As Excel.Range, _
	Transposed As Boolean _
)

C#

void tcXlAddIn.UpdateChart(
	object Target,
	string ChartName,
	Excel.Range Range,
	bool Transposed
);

需要排查问题吗?

查看我们的知识库