2014-01-20 149 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

很好地完成。如果我這樣做了,我會寫下子,這樣我就可以在每個形狀中調用它一次,將形狀作爲參數傳遞給它。通過這種方式,您可以將組中的每個形狀遞歸傳遞給函數,然後處理組內的組(在...內的組內) –

相關問題