2014-01-20 74 views
2

我需要编写一个程序,可以遍历演示文稿并将文本字符串的所有实例更改为不同的演示文稿。因此,例如,在出现文本字符串“旧公司名称”的地方,它将用“新公司名称”替换它。以编程方式编辑PowerPoint演示文稿中的文本

我对如何实现Powerpoint自动化有一个大致的想法,但挑战在于它很难走过形状对象,而且在存储此数据的位置看不到明显的属性(例如,“文本“财产。)

有人可以指出我在正确的方向吗?

此外,有没有一种工具可以让您更容易地深入到Office产品的对象模型中,也就是说走一个特定文档的实例对象树?通常情况下,我会用Visual Studio调试器来做这件事,但因为它是COM顶层的一个薄层,所以你不能像在其他情况下那样轻易地在监视窗口中移动对象实例树。有没有一个很好的工具来帮助解决这个问题?

PPT 2010如果它很重要。

+1

你能使用VBA,而不是C#作为好?如果是这样,请添加VBA标签,以便获得VBA答案。 –

+0

好主意。我做到了。 –

+0

您是否只有旧的PPT文件或新的PPTX文件? –

回答

3

简单地说,因为无法用Word和Excel记录宏,所以Powerpoint是自动化(使用VBA)的更复杂的Office应用程序之一。我发现学习对象模型的最好方式是将网页搜索和对象浏览器与VBIDE结合使用(只需按F2键)。

至于文字替换,一旦你知道,这是一个容易的情况。您可以遍历特定幻灯片中的所有形状,然后检查该形状的文本。 (注意,此代码实际上来自一个Excel工作簿,因此它具有Powerpoint引用这没有必要从PowerPoint中:

编辑:史蒂夫使得有关原始编辑一个非常好的问题只能搜索文本框,根据在您的演示文稿设置中,您必须单独对每种类型的对象进行排序,并在每种类型上实施自定义替换,而不是特别难于仅在后方产生痛苦

另请注意,根据演示文稿的大小,它可能需要一段时间来循环所有的形状,我也使用了.HasTextFrame/.HasTable.Type的组合,所以你可以看到两种类型。

Sub ReplaceTextShape(sFindText As String, sNewText As String, ppOnSlide As PowerPoint.Slide) 
    Dim ppCurShape As PowerPoint.Shape 

    For Each ppCurShape In ppOnSlide.Shapes 
     If ppCurShape.HasTextFrame Then 
      ppCurShape.TextFrame.TextRange.Text = VBA.Replace(ppCurShape.TextFrame.TextRange.Text, sFindText, sNewText) 
     ElseIf ppCurShape.HasTable Then 
      Call FindTextinPPTables(ppCurShape.Table, sFindText, sNewText) 
     ElseIf ppCurShape.Type = msoGroup Then 
      Call FindTextinPPShapeGroup(ppCurShape, sFindText, sNewText) 
      ''Note you'll have to implement this function, it is an example only 
     ElseIf ppCurShape.Type = msoSmartArt Then 
      Call FindTextinPPSmartArt(ppCurShape, sFindText, sNewText) 
      ''Note you'll have to implement this function, it is an example only 
     ElseIf ppCurShape.Type = msoCallout Then 
      'etc 
     ElseIf ppCurShape.Type = msoComment Then 
      'etc etc 
     End If 
    Next ppCurShape 

    Set ppCurShape = Nothing 
End Sub 

然后替换整个演示文稿中的所有文本:

Sub ReplaceAllText(ppPres As PowerPoint.Presentation) 
    Dim ppSlide As PowerPoint.Slide 

    For Each ppSlide In ppPres.Slides 
     Call ReplaceTextShape("Hello", "Goodbye", ppSlide) 
    Next ppSlide 

    Set ppSlide = Nothing 
End Sub 

和示例代码表中的替换文本:

Sub FindTextinPPTables(ppTable As PowerPoint.Table, sFindText As String, sReplaceText As String) 
    Dim iRows As Integer, iCols As Integer 

    With ppTable 
     iRows = .Rows.Count 
     iCols = .Columns.Count 

     For ii = 1 To iRows 
      For jj = 1 To iCols 
       .Cell(ii, jj).Shape.TextFrame.TextRange.Text = VBA.Replace(.Cell(ii, jj).Shape.TextFrame.TextRange.Text, sFindText, sReplaceText) 
      Next jj 
     Next ii 
    End With 

End Sub 
+0

只是谨小慎微:这不会真的取代*全部*演示文稿中的文字。它会遗漏分组的形状,表格中的文字,图表中的文字,智能形状中的文字,以及我确信其他一些我没有想到的副手。啊。并在主人&布局和笔记页面上的形状。 –

+0

@SteveRindsberg公平的电话,我做了一个编辑。 – CuberChase

+0

很好地完成。如果我这样做了,我会写下子,这样我就可以在每个形状中调用它一次,将形状作为参数传递给它。通过这种方式,您可以将组中的每个形状递归传递给函数,然后处理组内的组(在...内的组内) –

相关问题