我試圖自動生成報告,PowerPoint演示文稿。當前不能正常工作的功能是PowerPoint的自動文本自動擬合,它在文本溢出形狀邊界時發生。觸發PowerPoint中的文本自動調整行爲,不顯示應用程序窗口
如果形狀被設定爲使得文本必須適合的形狀(這是默認值),則在形狀所有文本的字體尺寸被自動文本被添加降低。這種行爲顯然只在應用程序可見時激活。這可能是因爲實際呈現文本的行爲是通知PowerPoint已發生溢出並觸發了縮小字體的操作。
當我做與隱藏應用程序窗口的演示,這個自動擬合不會發生。如果我以任何方式打開演示文稿並修改文本框,則字體會縮小。隱藏然後重新顯示幻燈片也會成功更新字體。隱藏演示文稿時從VBA執行這些相同的操作不會觸發字體大小更新。
有誰知道如何觸發PowerPoint中的字體自動調整行爲,而不顯示應用程序窗口?
下面是一個小例子來說明這個問題:
Sub new_presentation()
Dim pres As Presentation
Dim sl As Slide
Dim textbox As Shape
Dim tf As TextFrame
Dim tr As TextRange
Set pres = Application.Presentations.Add(WithWindow:=msoFalse)
' For Each Layout In pres.SlideMaster.CustomLayouts
' Debug.Print Layout.Name
' Next
Set sl = pres.Slides.AddSlide(1, pres.SlideMaster.CustomLayouts.Item(2))
Set textbox = sl.Shapes.Placeholders(2)
Set tf = textbox.TextFrame
Set tr = tf.TextRange
tr.Text = "Some text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text" & vbCrLf & _
"More Text"
pres.SaveAs FileName:="D:\Documents\Python\powerpoint\vba_demo.pptx"
pres.Close
End Sub
記住更新另存爲文件命名爲您的系統上有效的文件夾爲它工作。
我在Windows 7上使用PowerPoint 2013年這種行爲在其他版本可能同樣存在。
我實際上是在用python-pptx和COM的組合來完成這項工作,但是VBA的例子也有同樣的行爲,我認爲這個例子對於人們來說比起其他編程來說要容易得多語言。
編輯: 這是有史以來沒有顯示PowerPoint應用程序窗口生成的文件的鏈接。編輯文本,隱藏幻燈片,添加幻燈片等將強制更新,這將觸發自動適應行爲。 Example File
這是一個PowerPoint文件,其中包含創建自動生成文件的宏。 Macro File
下面用於手動縮放文本的解決方法的代碼已註釋掉。
編輯: 作爲一種折中的解決方法,下面的代碼減小字體大小,直到文本適合...所以它是一個手工編碼的自適應。我添加了一些縮進級別來驗證具有不同字體大小的級別都以相對方式縮放。我仍然想知道是否有辦法讓PowerPoint的自動套用功能做到這一點,所以我會留下這個問題。
Sub new_presentation()
Dim pres As Presentation
Dim sl As Slide
Dim textbox As Shape
Dim tf As TextFrame
Dim tr As TextRange
Set pres = Application.Presentations.Add(WithWindow:=msoFalse)
' For Each Layout In pres.SlideMaster.CustomLayouts
' Debug.Print Layout.Name
' Next
Set sl = pres.Slides.AddSlide(1, pres.SlideMaster.CustomLayouts.Item(2))
Set textbox = sl.Shapes.Placeholders(2)
Set tf = textbox.TextFrame
Set tr = tf.TextRange
tr.Text = "Row 1" & vbCrLf & _
"Row 2" & vbCrLf & _
"Row 3" & vbCrLf & _
"Row 4" & vbCrLf & _
"Row 5" & vbCrLf & _
"Row 6" & vbCrLf & _
"Row 7" & vbCrLf & _
"Row 8" & vbCrLf & _
"Row 9" & vbCrLf & _
"Row 10" & vbCrLf & _
"Row 11" & vbCrLf & _
"Row 12" & vbCrLf & _
"Row 13" & vbCrLf & _
"Row 14"
' Indent some rows out to levels 2 and 3
tr.Paragraphs(2, 1).IndentLevel = 2
tr.Paragraphs(3, 3).IndentLevel = 3
tr.Paragraphs(6, 1).IndentLevel = 2
tr.Paragraphs(7, 3).IndentLevel = 3
tr.Paragraphs(10, 1).IndentLevel = 2
tr.Paragraphs(11, 3).IndentLevel = 3
' Get the max height for the text to fit in the box...
h_max = textbox.Height - tf.MarginTop - tf.MarginBottom
overflow = tr.BoundHeight - h_max
iLoop = 0
While overflow > 0 And iLoop < 20
prev_overflow = overflow
For i = 1 To tr.Paragraphs.Count
Set p = tr.Paragraphs(i, 1)
before = p.Font.Size
after = Round(before * 0.9, 0)
p.Font.Size = after
Next
overflow = tr.BoundHeight - h_max
iLoop = iLoop + 1
Debug.Print "Iteration: " & iLoop & " Overflow: " & overflow
Wend
pres.SaveAs FileName:="D:\Documents\Python\powerpoint\vba_demo.pptx"
pres.Close
End Sub
不錯的實驗!我想要的是永遠不必在PowerPoint應用程序窗口中顯示生成的文件(甚至是最小化),但只是靜靜地生成它,然後在用戶第一次看到文本時,文本已經自動適應。我已經添加了示例文件鏈接,其中顯示了我目前正在獲取的內容。感謝您的幫助!使用最小化窗口可能是另一種解決方法。 – flutefreak7
Doh。首先正確地閱讀問題我告訴自己(我錯過了隱藏的窗口部分)。好吧,現在玩你的榜樣...已經發現一些好奇的事情。儘快報告。 –