невозможно скопировать таблицу, используя python -pptx - PullRequest
0 голосов
/ 29 января 2020

У меня есть требование, чтобы прочитать шаблон и сделать из него новый 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)

кто-нибудь может мне помочь?

...