Изменить место добавления таблицы в документ 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")