我期待在形状的文本执行文本替换。我使用的代码类似于下面的片段:
# define key/value
SRKeys, SRVals = ['x','y','z'], [1,2,3]
# define text
text = shape.text
# iterate through values and perform subs
for i in range(len(SRKeys)):
# replace text
text = text.replace(SRKeys[i], str(SRVals[i]))
# write text subs to comment box
shape.text = text
但是,如果初始的shape.text
有格式化的字符(例如粗体),那么在读取时会删除格式化。有解决方案吗?
我唯一能想到的是迭代字符并检查格式,然后在写入shape.text
之前添加这些格式。
2条答案
按热度按时间idfiyjo81#
@usr2564301在正确的轨道上。字符格式(又名“字体”)在运行级别指定。这就是运行;所有共享相同字符格式的字符的“运行”(序列)。
当你赋值给
shape.text
的时候,你会用一个新的运行替换所有的运行,这个新的运行具有默认的格式。如果你想保留格式,你需要保留那些没有直接参与文本替换的运行。这不是一个小问题,因为不能保证在单词边界上会出现连读。试着打印出几个段落的连读,我想你会明白我的意思。
在粗略的伪代码中,我认为这是您需要采取的方法:
这将保留不涉及搜索字符串的任何运行,并保留“替换”单词中“匹配”单词的格式。
这需要一些当前API不直接支持的操作。对于那些操作,您需要使用较低级别的
lxml
调用来直接操作XML,尽管您可以从python-pptx
对象中获得所需的所有现有元素,而无需自己解析XML。uajslkp62#
下面是我使用的代码的改编版本(灵感来自@scanny的答案),它替换了幻灯片上所有形状(带文本框架)的文本。