2016-06-20 10 views
0

Вопрос в Вкратце: Как я могу использовать найти и заменить опцию (Ctrl + H) с использованием Python-PPTX модуль?Python PPTX (Power Point) Найти и заменить текст (Ctrl + H)

Пример кода:

from pptx import Presentation 

nameOfFile = "NewPowerPoint.pptx" #Replace this with: path name on your computer + name of the new file. 

def open_PowerPoint_Presentation(oldFileName, newFileName): 
    prs = Presentation(oldFileName) 

    prs.save(newFileName) 
open_PowerPoint_Presentation('Template.pptx', nameOfFile) 

У меня есть документ Power Point под названием "Template.pptx". С моей программой Python я добавляю несколько слайдов и помещаю в них несколько фотографий. После того, как все изображения будут помещены в документ, он сохранит его в качестве другой презентации точки питания.

Проблема в том, что этот «Template.pptx» имеет в нем все номера старой недели, например «Неделя 20». Я хочу, чтобы Python нашел и заменил все эти словосочетания на «Неделя 25» (например).

ответ

1

Вам нужно будет посетить каждый слайд на каждой фигуре и искать совпадение, используя доступные текстовые функции. Это может быть не очень красиво, потому что PowerPoint имеет привычку расщепляться, что может показаться странными кусками. Он делает это для поддержки таких функций, как проверка орфографии и т. Д., Но его поведение непредсказуемо.

Так что найти вхождения с такими вещами, как Shape.text, вероятно, будет легкой частью. Замена их, не теряя при этом никакого форматирования шрифтов, может быть сложнее, в зависимости от особенностей вашей ситуации.

+0

Итак, нет достойного/простого способа имитировать поиск и замену funtion в презентации Power Point с Python? Даже не с другими модулями? – Morganis

+1

@Morganis - вы можете использовать IronPython для управления презентацией PowerPoint под Windows с использованием API Microsoft (аналогично VBA). Это будет работать только на стороне клиента (в отличие от сервера) и может быть немного медленным (это на моей машине, но я запускаю Windows в виртуальной машине). Но это было бы намного быстрее, чем делать это вручную. Я не знаю никаких других библиотек Python, которые предоставляют подробное редактирование файла PowerPoint, хотя прошло некоторое время с тех пор, как я осмотрелся. Я автор python-pptx btw. – scanny

1

Я знаю, что этот вопрос старый, но я только что закончил проект, который использует python для обновления PowerPoint ежедневно. Каждое утро запускается скрипт python, и он извлекает данные за этот день из базы данных, помещает данные в powerpoint, а затем запускает средство просмотра PowerPoint для воспроизведения PowerPoint.

Чтобы ответить на ваш вопрос, вам нужно будет просмотреть все фигуры на странице и проверить, находится ли строка, которую вы ищете, в shape.text. Вы можете проверить, имеет ли текст текст, проверяя, является ли shape.has_text_frame истинным. Это позволяет избежать ошибок.

Здесь есть вещи, в которые попадают трики. Если бы вы просто заменили строку в shape.text текстом, который хотите вставить, вы, вероятно, потеряете форматирование. shape.text на самом деле является конкатенацией всего текста в форме. Этот текст можно разделить на множество «прогонов», и все эти прогоны могут иметь другое форматирование, которое будет потеряно, если вы напишете над shape.text или замените часть строки.

На слайде у вас есть фигуры, а фигуры могут иметь text_frame, а в text_frames есть параграфы (по крайней мере один, всегда, даже когда он пуст), и абзацы могут выполняться. Любой уровень может иметь форматирование, и вы не можете определить, сколько пробегов ваша строка разделяется.

В моем случае я убедился, что любая строка, которая должна была быть заменена, была в его собственной форме. Вы все еще должны сверлить весь путь до запуска и установить там текст, чтобы все форматирование было сохранено. Кроме того, строка, которую вы сопоставляете в shape.text, может быть фактически разбросана по нескольким прогонам, поэтому при настройке текста в первом запуске я также устанавливаю текст во всех остальных прогонах этого абзаца пустым.

случайный код Snippit:

from pptx import Presentation 

testString = '{{thingToReplace}}' 
replaceString = 'this will be inserted' 
ppt = Presentation('somepptxfile.pptx') 

def replaceText(shape, string,replaceString): 
    #this is the hard part 
    #you know the string is in there, but it may be across many runs 


for slide in ppt.slides: 
    for shape in slide.shapes: 
     if shape.has_text_frame: 
      if(shape.text.find(testString)!=-1: 
       replaceText(shape,testString,replaceString) 

К сожалению, если есть какая-либо опечатка. Im at work .....