Редактирование базового XML PowerPoint с помощью Python (python-pptx)


У меня есть файлы PowerPoint со многими десятками ссылок на различные листы в документе Excel. Мне нужно изменить документы Excel, на которые указывают эти ссылки программным способом.

Я уверен, что мог бы сделать это с помощью VBA, но поскольку я все равно создаю документы Excel на python, я бы предпочел обновить ссылки и там.

Я порылся в нижележащих XML-файлах для тестового файла .pptx и обнаружил, что ссылки на ссылки живут в папке ppt/slides/_rels/ (после распаковка файла .pptx)

Например, slide1.xml.rels содержит несколько отношений, одно из которых имеет TargetMode="External" и Target="FULL_PATH_OMITTEDtest.xlsx!Sheet1!R3C5:R20C14"

Используя пакет python-ppt, я обнаружил, что эта же ссылка живет под slide.part.rels

Например:

for rel in slides[0].part.rels.values():
    if rel.is_external:
        print(rel.target_ref)

Находит тот же путь для ссылки (т. е. "FULL_PATH_OMITTEDtest.xlsx!Sheet1!R3C5:R20C14")

Я не знаю, как изменить это значение, если оно может быть изменено. Просто пытаясь установить его с помощью python-pptx производит AttributeError

Есть ли способ изменить базовый XML для a Файл PowerPoint с использованием python-pptx? Или подойдет какая-нибудь альтернативная стратегия.

1 2

1 ответ:

Попробуйте установить атрибут ._target объекта rel (Relationship).
https://github.com/scanny/python-pptx/blob/master/pptx/opc/package.py#L555

rel._target = 'FULL_PATH_OMITTED\test.xlsx!Sheet1!R3C5:R20C14'
Это будет работать только тогда, когда тип отношения является внешним (В отличие от отношения к другой части в том же пакете). Это взлом внутренних органов, конечно, так что используйте на свой страх и риск. Тем не менее, эта часть кодовой базы была очень стабильной в течение длительного времени.