У меня есть требование, чтобы прочитать шаблон и сделать из него новый ppt. В моем шаблоне ppt у меня есть таблица на слайде, я хочу скопировать этот слайд, поместить его рядом и заполнить данные. Весь мой код работает нормально, кроме копирования части таблицы.
для копирования таблицы, я пришел с этим кодом из здесь
def clone_shape(shape, left, top, width, height):
"""Add a duplicate of `shape` to the slide on which it appears."""
shape_obj = shape._element
sp_tree = shape_obj.getparent()
new_sp = copy.deepcopy(shape_obj)
sp_tree.append(new_sp)
new_shape = (
GraphicFrame(new_sp, None)
if isinstance(shape, GraphicFrame)
else Shape(new_sp, None)
)
new_shape.left = left
new_shape.top = top
new_shape.width = width
new_shape.height = height
return new_shape
нет никаких исключений, пока ppt генерирует, но когда я открываю сгенерированный PPT, он выдает ошибку восстановления, и я потерял некоторые данные, затем я копаюсь и обнаружил, что это из-за идентификаторов формы не уникальны. Итак, я добавил нижнюю строку в вышеуказанную функцию
new_shape.shape_id = shape.shape_id + random.randint(10,1000)
, но проблема в том, что она выдает исключение "невозможно назначить атрибуту только для чтения", я обнаружил, что мы не можем назначить shape_id вручную, возможно, из-за ограничений дизайна и Я полностью согласен с этим.
Затем я пришел с кодом ниже,
import copy
import Renderer
# Renderer is my class which has text renderer,
# table renderer etc and also it has some utility
# methods such as _get_slide_by_id etc...
obj = Renderer("/path/to/my/template.pptx")
slide = obj._get_slide_by_id(317)
shape = obj._get_shape_by_id(slide, 13)
new_shape = slide.shapes.add_table(
len(shape.table.rows),
len(shape.table.columns),
shape.width + shape.left,
shape.top,
shape.width,
shape.height,
)
new_shape._element = copy.deepcopy(shape._element)
obj.save("/tmp/sample.pptx")
, но свойства таблицы не копируются, таблица добавляется, но это не та таблица, которую я хочу скопировать. я даже пробовал это, но не работает
new_shape.table._tbl = copy.deepcopy(shape.table._tbl)
new_shape.table._graphic_frame = copy.deepcopy(shape.table._graphic_frame)
кто-нибудь может мне помочь?