Python和PowerPoint替换“ <br> <br>”成为“ _x000D_”

时间:2019-06-17 19:38:14

标签: python powerpoint python-pptx

我正在使用Python pptx创建PowerPoint,并且查询结果字符串包含html'd',并且尝试将其替换为'\ n',例如:

<br><br>

这导致以“ TDsFirst = "\n" + self.TxtStringFromSQLserver.replace('<br><br>', '\n') TDPs = TDPsFirst.replace('<br>', '\n') TipDPsText_run.text = TDPs ”结尾的行

我在做什么错?如何将'_x000D_'转换为退货?

2 个答案:

答案 0 :(得分:2)

此行为有点新,但是是预期的行为:
https://python-pptx.readthedocs.io/en/latest/api/text.html#pptx.text.text._Run.text

运行只能包含文本。换行符或段落边界发生在较高级别。特别是,换行符只能在段落内部的两次运行之间发生。段落“中断”只能出现在段落之间的文本框中。

因此,根据您要执行的操作,解决方案可能只是在文本框架级别进行分配,而不是按照变量名TipDPsText_run建议的运行级别进行分配。 \n接受换行符(TextFrame.text),并将其转换为段落边界。

这可能不能完全解决问题,但可以(我给它90%的可能性),并且至少会将问题更改为可以解决的问题。

更新:在进一步检查代码之后,"\x0A"实际上接受了Run.text换行符,并将其原样保留在XML中,看起来很像就像换行一样。这种传统的礼节并没有扩展到回车"\x0D",就像您看到的"_x000D_"一样。该额外的CR字节位于其中,因为您正在Windows上运行。因此,您可以通过在文本分配中使用"\x0A"代替"\n"来解决此问题。但我建议使用文本框架级分配,因为这种方法与PowerPoint行为更加一致,在这种情况下,输入回车键会创建一个新段落。

答案 1 :(得分:0)

尝试使用回车符(TDPs = TDPsFirst.replace('<br>', '\r') ):

TDPs = TDPsFirst.replace('<br>', '\r\n')

或回车+换行符

Maximum call stack size exceeded

关键似乎是Powerpoint用于换行的字符。

另请参见Access newline becoming _x000D_
  和
https://social.msdn.microsoft.com/Forums/office/en-US/9c258bd7-f357-4b66-9dbe-3df98855abcc/how-to-import-from-excel-and-keep-the-line-breaks?forum=accessdev