Изменить место добавления таблицы в документ Word с помощью python-docx

Делаю бота который создает документы. Есть шаблон документа, с ключами({1}{2}{3}{4} и т.д.) в ключ {10} необходимо вставить таблицу, но как я не пытался, вставляет он ее в конце. Как вставить таблицу на месте ключа?

И еще вопрос, как изменить размер 2 столбца? Пытаюсь указывать row.cells[1].width = 100, но нечего не меняется. КОД:

def generate(self):
    print("генерация документа")
    doc = Document('docs/vivoz.docx')
    dat = self.data["Дата приказа"].data.split(".")
    data = f"«{dat[0]}» {dat[1]}.{dat[2]}г."
    style = doc.styles['Normal']
    style.font.name = 'Times New Roman'
    style.font.size = Pt(12)


    for para in doc.paragraphs:
        for run in para.runs:
            if "{1}" in run.text:
                run.text = run.text.replace("{1}", self.data["От кого заявление"].data)
            elif "{2}" in run.text:
                run.text = run.text.replace("{2}", self.data["Должность заявителя"].data)
            elif "{3}" in run.text:
                run.text = run.text.replace("{3}", short_name(self.data["На кого пишется заявление"].data))
            elif "{5}" in run.text:
                run.text = run.text.replace("{5}", data)
            elif "{6}" in run.text:
                run.text = run.text.replace("{6}", self.data["Название мероприятия"].data)
            elif "{7}" in run.text:
                run.text = run.text.replace("{7}", self.data["Дата События"].data)
            elif "{8}" in run.text:
                run.text = run.text.replace("{8}", self.data["Адрес мероприятие"].data)
            elif "{9}" in run.text:
                run.text = run.text.replace("{9}", self.data["Место вывоза"].data)
            elif "{10}" in run.text:


                table = doc.add_table(rows=len(self.data["Оборудование"].data), cols=2, style='Table Grid')
                for i in range(len(self.data["Оборудование"].data)):
                    row = table.rows[i]
                    ob_str = self.data["Оборудование"].data[i]
                    row.cells[0].text = ob_str["имя"]
                    row.cells[1].text = f'{ob_str["количество"]} {ob_str["единица"]}'
                    row.cells[1].width = 100
                p = run._element
                p.getparent().remove(p)
                doc.add_paragraph()
                doc._element.body.append(table._element)




    doc.save(f"{self.name}.docx")
    return f"{self.name}.docx"

Получается это:

Документ который получается


Ответы (1 шт):

Автор решения: Данил Занозин

Облазив весь интернет, перелопатив саму библиотеку python-docx, осознал, что нету в ней таких возможностей. Так как параграфы и таблицы - это совершенно разные данные, НИКАК друг к другу не относящиеся.

Решение оказалось сильно проще.

  • В шаблоне, в нужном месте, сделал таблицу в одну строку и два столбца (шапка таблицы),
  • Нашёл ее через doc.tables,
  • и напрямую нагенерировал в ней строчек.

Вопрос с размером ячейки также решился. В шаблоне таблицу сразу сделал необходимого размера.

КОД:

def generate(self):
    print("генерация документа")
    doc = Document('docs/vivoz.docx')
    dat = self.data["Дата приказа"].data.split(".")
    data = f"«{dat[0]}» {dat[1]}.{dat[2]}г."
    style = doc.styles['Normal']
    style.font.name = 'Times New Roman'
    style.font.size = Pt(12)


    for para in doc.paragraphs:
        for run in para.runs:
            if "{1}" in run.text:
                run.text = run.text.replace("{1}", self.data["От кого заявление"].data)
            elif "{2}" in run.text:
                run.text = run.text.replace("{2}", self.data["Должность заявителя"].data)
            elif "{3}" in run.text:
                run.text = run.text.replace("{3}", short_name(self.data["На кого пишется заявление"].data))
            elif "{5}" in run.text:
                run.text = run.text.replace("{5}", data)
            elif "{6}" in run.text:
                run.text = run.text.replace("{6}", self.data["Название мероприятия"].data)
            elif "{7}" in run.text:
                run.text = run.text.replace("{7}", self.data["Дата События"].data)
            elif "{8}" in run.text:
                run.text = run.text.replace("{8}", self.data["Адрес мероприятие"].data)
            elif "{9}" in run.text:
                run.text = run.text.replace("{9}", self.data["Место вывоза"].data)
    #беру 1 таблицу из списка таблиц документа
    table = doc.tables[0]
    #перебераю оборудование которое нужно вставить
    for obor in self.data["Оборудование"].data:
        #создаю новую строку в таблице
        cells = table.add_row().cells
        # информация в 1й столбик
        cells[0].text = obor["имя"]
        # информация во 2й столбик
        cells[1].text = f"{obor['количество']} {obor['единица']}"
    doc.save(f"{self.name} заявление.docx")
→ Ссылка