我正在尝试自动生成作为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
请记住将SaveAs文件名更新为系统上的有效文件夹,以便其工作。
我在Windows 7上使用PowerPoint 2013。这种行为可能也存在于其他版本中。
我实际上是使用python-pptx和COM的组合来使用Python来做这件事,但是VBA示例做了同样的行为,我认为这个示例比另一种编程语言中的同样的东西更容易让人玩。
编辑:这里有一个链接,指向一个从未显示PowerPoint应用程序窗口的文件。编辑文本、隐藏幻灯片、添加幻灯片等将强制更新,从而触发自动调整行为。示例文件
这是一个PowerPoint文件,其中包含创建自动生成文件的宏
下面用作手动缩放文本的变通方法的代码被注释掉。
编辑:作为一个折衷的解决方法,下面的html" target="_blank">代码会减小字体大小,直到文本适合为止...所以这是一个手工编码的自动匹配。我添加了一些缩进级别,以验证不同字体大小的级别都以相对的方式缩放。我仍然想知道是否有办法让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
我做了一个非常简单的测试,在一张空幻灯片上添加了一个文本框。我设置了以下属性:
.TextFrame2.AutoSize = msoAutoSizeTextToFitShape ' Shrink text on overflow
.TextFrame.WordWrap ' Wrap text in shape
然后,我最小化了窗口,创建了一个新的演示文稿(从而成为活动窗口),然后通过VBE即时窗口以编程方式向第一个演示文稿中的形状添加了一长串文本:
演讲(1)。幻灯片(1)。形状(1)。文本框架。文本范围。文本="Lorem ipsum dolor sit amet,consecetuer adipiscing elit。Maecenas porttitor congue Massa。Fusce posuere,magna ed pulvinar ultricies,purus lectus malesuada Libero,sit amet commodo magna eros quis urna。"
在Windows任务栏中将鼠标移到PowerPoint缩略图堆上时,我已经可以看到文本大小已减小。因此,自动装配功能似乎对我有效。
更新:
因此,即使您将pres设置为具有可见(最小化或其他)窗口,似乎也没有应用自动调整大小功能,因为在PowerPoint有机会更新它之前,pres已关闭。我测试了一种理论,即PowerPoint在代码停止之前不会更新视图,只需更改代码的一行即可:
Set pres = Application.Presentations.Add(WithWindow:=msoFalse)
然后我在SaveAs行上设置了一个断点。当代码被中断时,您可以看到AutoSize起作用,而当让它自由运行时,AutoSize不起作用。如果我在一个可见窗口中运行它,并且最后两行被注释掉,也会发生同样的情况。因此,在代码运行和/或代码完成时,PowerPoint无法刷新内容。我尝试了各种DoEvents和Sleep的组合(使用WinAPI),但都没有效果。我还注意到,在使用Sleep时,窗口中出现了一张幻灯片,但没有任何内容(就像PowerPoint在刷新窗口之前等待代码执行完成)。所以我一直在想,除非在关闭文件之前让代码完成,否则这是行不通的。
我有一个字段,上面有一个客户文本观察者。在一段代码中,我需要更改EditText中的值,我使用<code>.setText(“whather”)来执行此操作。 问题是,只要我做了更改,就会调用<code>afterextchanged 我需要 afterTextChanged 方法中的文本,因此不建议删除 。
我正在进行drools fusion 6.2决赛,希望在流模式下发生新事件时触发规则。但规则本身并没有遭到抨击。 我的规则文件内容如下: 代码如下: 故意调用规则时会触发规则,但如果流中出现新事件,则无法触发规则。
我有这个脚本: HTML中的用法: 由于某些原因,它的工作,如果页面重新加载一半,但不,它没有开火,在它工作之前,所以我不知道发生了什么。我在wordpress网站上使用这个。
任何建议什么将是实施这种行为的最佳方式。 谢谢Bsengar
问题内容: 我有一个带有客户文本监视程序的字段。在一段代码中,我需要更改使用的EditText中的值。 问题是,一旦我进行更改,就会调用该方法,从而创建了无限循环。如何在不触发afterTextChanged的情况下更改文本? 我需要afterTextChanged方法中的文本,因此不建议删除。 问题答案: 您可以注销观察者,然后重新注册。 另外,您可以设置一个标志,以便观察者知道自己刚刚更改文本
在Spring Boot中,文档似乎鼓励在应用程序启动时运行迁移。 这很好,但有时应用程序启动可能会有副作用/依赖性,我不想麻烦-我只想自己运行迁移。设想一下,只需建立一个本地开发人员数据库,就可以在其中闲逛,甚至不用运行应用程序。 相比之下,在Dropwanner中,单独运行迁移对于应用程序的内置参数来说很简单,就像这样 Spring靴有什么等价物吗?还是我必须直接去喝liquibase? 我对