Python и PowerPoint заменяют '<br><br>' на '_x000D_' - PullRequest
0 голосов
/ 17 июня 2019

Я создаю PowerPoint с Python pptx, и моя строка результата запроса содержит HTML '<br><br>', и я пытаюсь заменить его на '\ n', например:

TDsFirst = "\n" + self.TxtStringFromSQLserver.replace('<br><br>', '\n')
TDPs = TDPsFirst.replace('<br>', '\n')
TipDPsText_run.text = TDPs

Thisв результате строки, заканчивающиеся на '_x000D_'

Что я делаю не так?Как я могу преобразовать '<br>' в возврат?

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Это поведение немного новое, но ожидаемое поведение:
https://python -pptx.readthedocs.io / ен / последний / 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, когда при вводе возврата каретки создается новый абзац.

0 голосов
/ 17 июня 2019

Попробуйте использовать возврат каретки (\r) вместо:

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

или возврат каретки + перевод строки

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

Похоже, ключ в том, какие символы Powerpoint использует для новых строк.

См. Также : Доступ к новой строке становится _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

...