22. 使用 Excel 数据实现自动化

在 Excel 中按照“Excel 数据链接”中所述提供数据后,您可以使用 UpdateChartPresentationFromTemplate 函数通过编程对该数据的使用进行控制。

通过 UpdateChart,您可以对特定图表的数据表和您的数据进行交换。通过 PresentationFromTemplate,您可以根据 PowerPoint 模板,使用数据创建新的演示文稿(将 think-cell 图表链接到 Excel 中的数据范围)。

这两个函数的接口都已集成到 Office Automation 模型中,因此可以通过能对 Office 编程的任何语言(例如 Visual Basic for Applications 或 C#)进行访问。

think-cell 的入口点是 think-cell 加载项对象。可以通过 Application.COMAddIns 集合对其进行访问。调用 think-cell 始终采用后期绑定。如需说明,请参阅 Microsoft 的知识库:

http://support.microsoft.com/kb/245115

因此,think-cell 加载项对象的类型只是 Object,没有要添加的类型库或引用。只需获取对象,即可进行调用:

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

22.1
UpdateChart
22.2
PresentationFromTemplate

22.1 UpdateChart

22.1.1 签名

tcaddin.UpdateChart( _ 
    pres As PowerPoint.Presentation, _ 
    strName As String, _ 
    rgData As Excel.Range, _ 
    bTransposed As Boolean _ 
)

22.1.2 描述

从 Excel 调用此函数,此函数将使用 rgData 中包含的数字更新 pres 中的图表 strName。范围 rgData 必须符合“从 Excel 创建图表”中描述的布局。

请注意,演示文稿对象 pres 也可用于参考演示文稿中的幻灯片范围。有关更多信息,请参阅:

http://msdn.microsoft.com/en-us/vba/powerpoint-vba/articles/slide-object-powerpoint

图表名称 strName 的匹配不区分大小写。先前必须已经按照“自动化简介”中所述在 PowerPoint 中使用 UpdateChart 名称属性控件分配该名称。图表名称在 pres 定义的演示文稿或幻灯片范围内必须唯一。

若已将图表链接到 Excel 数据范围,则调用此函数时,链接将中断。此后,不会将图表链接到任何 Excel 范围。

22.1.3 示例

若要使用此示例,请在 Excel 的 Visual Basic for Applications 窗口中,依次前往工具引用,然后添加 Microsoft PowerPoint 对象库。

' When Option Explicit appears in a file, you must 
' explicitly declare all variables using the Dim 
' or ReDim statements. If you attempt to use an 
' undeclared variable name, an error occurs at 
' compile time. 
' Use Option Explicit to avoid incorrectly typing 
' the name of an existing variable or to avoid 
' confusion in code where the scope of the 
' variable is not clear. If you do not use the 
' Option Explicit statement, all undeclared 
' variables are of Object type. 
' http://msdn.microsoft.com/en-us/ 
' library/y9341s4f%28v=vs.80%29.aspx 
Option Explicit 
 
Sub UpdateChart_Sample() 
 
   ' Get the range containing the new data 
   Dim rng As Excel.Range 
   Set rng = _ 
    ActiveWorkbook.Sheets("Sheet1").Range("A1:D5") 
 
   ' Get the think-cell add-in object 
   Dim tcaddin As Object 
   Set tcaddin = _ 
    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:\\template.pptx", _ 
      Untitled:=msoTrue) 
 
   ' PowerPoint window invisible 
   Set pres = ppapp.Presentations.Open( _ 
    Filename:="c:\\template.pptx", _ 
    Untitled:=msoTrue, _ 
    WithWindow:=msoFalse) 
 
   ' The name "Chart1" must have been 
   ' previously assigned to the chart using 
   ' the control in the floating toolbar. 
   ' The final argument indicates whether 
   ' the data range is transposed or not. 
   Call tcaddin.UpdateChart(pres, "Chart1", rng, _ 
    False) 
 
   ' Save the updated presentation 
   pres.SaveAs ("c:\\template_updated.pptx") 
   pres.Close 
 
   ppapp.Quit 
End Sub

下一个示例会显示如何通过 C# 使用 UpdateChart


using Excel = Microsoft.Office.Interop.Excel; 
using PowerPoint = Microsoft.Office.Interop.PowerPoint; 
using Office = Microsoft.Office.Core; 
// Open the Solution Explorer > right-click the project file > "Add Reference..." button and add he following references: 
// .NET tab > Microsoft.Office.Interop.Excel 12.0.0.0 
// .NET tab > Microsoft.Office.Interop.PowerPoint 12.0.0.0 
// COM tab  > Microsoft Office 14.0 Object Library 
namespace ConsoleApplication_UpdateChart 
{ 
  class Program 
  { 
    static void Main() 
    { 
      Excel.Application xlapp = new Excel.Application(); 
      xlapp.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://template.pptx", Office.MsoTriState.msoFalse, Office.MsoTriState.msoTrue); 
 
      object[] aobjArg = new object[] { (object)presentation, "Chart1", worksheet.get_Range("A1", "D3"), false }; 
 
      Office.COMAddIn comaddin = xlapp.COMAddIns.Item("thinkcell.addin"); 
      object objAddIn = comaddin.Object; 
      objAddIn.GetType().InvokeMember("UpdateChart", System.Reflection.BindingFlags.InvokeMethod, null, objAddIn, aobjArg); 
 
      presentation.SaveAs("C://template_updated.pptx"); 
      presentation.Close(); 
      ppapp.Quit(); 
 
      workbook.Close(false); 
      xlapp.Quit(); 
    } 
  } 
}

图 22.1:UpdateChartC# 中的示例

22.2 PresentationFromTemplate

22.2.1 签名

tcaddin.PresentationFromTemplate( _ 
    wb As Excel.Workbook, _ 
    strTemplate As String, _ 
    ppapp As PowerPoint.Application _ 
) As PowerPoint.Presentation

22.2.2 描述

从 Excel 中调用此函数,此函数可将 wb 中的任何数据链接应用到文件名为 strTemplate 的模板。结果是,在 PowerPoint 实例 ppapp 中产生新的演示文稿。

strTemplate 可以是完整路径,也可以是相对路径(随后会将其作为相对于 Excel 工作簿文件 wb 所在位置的相对路径)。

将更新 strTemplate 中已链接到 Excel 工作簿 wb 的所有图表(不论是否已将其设为自动更新,都是如此)。随后会中断其数据链接,以防止对这些图表进行进一步更改。

strTemplate 中已链接到除 wb 外其他 Excel 工作簿的图表将保持不变,并且仍保持链接状态,因此可以将此函数的结果另存为新模板,然后使用下一个工作簿再次调用此函数,以便更新多个 Excel 工作簿中的链接。

若您希望使用 Excel 链接控制图表段的颜色,可以将配色方案设为在顶部使用 Excel 填充(请参阅配色方案)。同样,若要使用 Excel 链接控制数字格式,请将其设为使用 Excel 格式(请参阅“数字格式”)。请确保先设置 Excel 中各单元格的背景色和数字格式,然后再调用 PresentationFromTemplate

22.2.3 示例

若要使用此示例,请在 Excel 的 Visual Basic for Applications 窗口中,依次前往工具引用,然后添加 Microsoft PowerPoint 对象库。

' When Option Explicit appears in a file, you must 
' explicitly declare all variables using the Dim 
' or ReDim statements. If you attempt to use an 
' undeclared variable name, an error occurs at 
' compile time. 
' Use Option Explicit to avoid incorrectly typing 
' the name of an existing variable or to avoid 
' confusion in code where the scope of the 
' variable is not clear. If you do not use the 
' Option Explicit statement, all undeclared 
' variables are of Object type. 
' http://msdn.microsoft.com/en-us/ 
' library/y9341s4f%28v=vs.80%29.aspx 
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("Sheet1").Cells(3, 2) 
 
   ' Get the think-cell add-in object 
   Dim tcaddin As Object 
   Set tcaddin = _ 
    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 
      rng.Value = i 
 
      ' Generate a new presentation based on the 
      ' linked template. 
      Dim pres As PowerPoint.Presentation 
      Set pres = tcaddin.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:\\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
think-cell 使用 Cookie 来改进本网站的功能、性能和安全性。如果您想使用本网站的全部功能,则需要您的同意。可在我们的隐私权政策中找到有关 think-cell 如何使用 Cookie、您的同意和您的隐私权的更多信息。