我想使用现有的powerpoint演示文稿来生成一系列报告:
在我的想象中,幻灯片幻灯片将以这样或类似的形式提供内容:
Date of report: {{report_date}}
Number of Sales: {{no_sales}}
...
然后我的python应用程序打开powerpoint,填写此报告的值并使用新名称保存报告。 我用Google搜索,但无法找到解决方案。
那里有python-pptx,但这都是关于创建新的演示文稿而不是在模板中插入值。
有人可以建议吗?
答案 0 :(得分:0)
我在一个挂着的“.ppx”文件上试过这个
微软办公室电源点“.pptx”文件采用“.zip”格式
当我解压缩文件时,我得到了一个“.xml”文件和三个目录
我的“.pptx”文件包含116张幻灯片,包含3,477个文件和22个目录/子目录
通常情况下,我会说它不可行,但由于您只有两个简短的更改,您可能会想出要更改的内容并压缩文件以创建一个新的“.ppx”文件。
警告:在一个或多个“.xml”文件中有一些二进制数据的xml blob。
答案 1 :(得分:0)
你绝对可以用python-pptx做你想做的事,也许不像你想象的那样直截了当。
您可以阅读演示文稿中的对象,包括幻灯片和幻灯片上的形状。因此,如果您想要更改第二张幻灯片上第二个形状的文本,您可以这样做:
#!/bin/bash
FINDER="1"
DOCK="2"
CAFF="3"
echo Select an option:
echo 1. killall Finder
echo 2. killall Dock
echo 3. caffeinate
echo Enter you choice:
read CHOICE
if [ "$CHOICE" = "$FINDER" ]; then
killall Finder
elif [ "$CHOICE" = "$DOCK" ]; then
killall Dock
elif [ "$CHOICE" = "$CAFF" ]; then
caffeinate
fi
唯一真正的问题是如何找到您感兴趣的形状。如果您可以对演示文稿(模板)进行非直观的更改,您可以确定形状ID或形状名称并使用它。或者,您可以获取每个形状的文本,并使用正则表达式来查找关键字/替换位。
它并非没有挑战,并且python-pptx没有专门为此角色设计的功能,但根据您的问题的参数,这绝对是可行的。
答案 2 :(得分:0)
最终,除了其他一些具有附加功能的库外,你需要某种强力方法来迭代Slides集合和每个Slide的相应Shapes集合,以便识别匹配的形状(除非有一些其他库有额外的PPT中的“查找”功能。这是仅使用win32com
的强力:
from win32com import client
find_date = r'{{report_date}}'
find_sales = r'{{no_sales}}'
report_date = '01/01/2016' # Modify as needed
no_sales = '604' # Modify as needed
path = 'c:/path/to/file.pptx'
outpath = 'c:/path/to/output.pptx'
ppt = client.Dispatch("PowerPoint.Application")
pres = ppt.Presentations.Open(path, WithWindow=False)
for sld in pres.Slides:
for shp in sld.Shapes:
with shp.TextFrame.TextRange as tr:
if find_date in tr.Text
tr.Replace(find_date, report_date)
elif find_sales in shp.TextFrame.Characters.Text
tr.Replace(find_sales, no_sales)
pres.SaveAs(outpath)
pres.Close()
ppt.Quit()
如果这些字符串在混合文本格式的其他字符串中,则保留现有格式会变得更加棘手,但它仍然可能。
如果模板文件仍在设计中且受您的控制,我会考虑为形状提供一个唯一的标识符,如CustomXMLPart
,或者您可以为形状'AlternativeText
属性指定一些内容。后者更容易使用,因为它不需要格式良好的XML,也因为它能够被看到和通过本机UI进行操作,而CustomXMLPart
只能通过编程方式访问,甚至有点违反直觉。您仍然需要进行逐个形状的迭代,但只需检查相关的属性值即可避免字符串比较。