我想在形状的文本中执行文本替换。我正在使用类似于以下代码段的代码:
# 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
。
@ usr2564301在正确的轨道上。在运行级别指定字符格式(也称为“字体”)。这就是奔跑。所有共享相同字符格式的字符的“运行”(序列)。
分配给shape.text
您时,将所有以前使用的运行替换为具有默认格式的一个新运行。如果要保留格式,则需要保留文本替换中不直接涉及的所有运行。
这不是一个小问题,因为不能保证在字边界上中断。尝试将运行结果打印出几段,我想您会明白我的意思的。
在粗略的伪代码中,我认为这是您需要采取的方法:
这将保留所有不涉及搜索字符串的运行,并保留“已替换”字词中“匹配”字词的格式。
这需要一些当前API不直接支持的操作。对于那些用户,您可以使用低级lxml
调用直接操作XML,尽管您可以从python-pptx
对象中获取所需的所有现有元素,而不必自己解析XML。
感谢您的回答-它有效!我写了一个效率不高的解决方案,但对代码却非常直接:1)遍历运行并存储文本和格式。2)对存储的文本执行文本替换。3)清除段落并写下每次运行(使用新的文本和格式)。注意:因为您无法编写run.font,所以必须选择要存储的字体属性(不理想)。
@MichaelBerk您可以分享您的代码/解决方案吗?