Автоматизация создания таблиц python docx
Я пытаюсь автоматизировать создание таблицы документа Word через python-docx. Исходный код создания таблицы выглядит вот так:
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt, RGBColor, Cm
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_ALIGN_VERTICAL
document = Document()
records_table1 = ((0, 'Nan', 'Nan', 0),
(1,'Первая величина', '-/-',0),
(2, 'Вторая величина', '-/-','Базальт'),
(3, 'Третья величина', 'м^2/ч',0))
table1 = document.add_table(rows = 1, cols = 4)
hdr_cells = table1.rows[0].cells
hdr_cells[0].text = '№ п/п'
hdr_cells[1].text = 'Наименование параметра'
hdr_cells[2].text = 'Единицы измерения'
hdr_cells[3].text = 'Значение'
for id, name, meas, value in records_table1:
row_cells = table1.add_row().cells
row_cells[0].text = str(id)
row_cells[1].text = name
row_cells[2].text = meas
row_cells[3].text = str(value)
table1.style = 'Table Grid'
document.save("testing.docx")
Я думаю что из этого можно сделать метод, однако мне пока не понятно как правильно проитерировать часть кода, которая отвечает за подстановку данных из records_table1 непосредственно в таблицу. Попробовал написать:
records = ((0, 'Nan', 'Nan', 0),
(1, 'Первая величина', '-/-',0),
(2, 'Вторая величина', '-/-','Базальт'),
(3, 'Третья величина', 'м^2/ч',0))
def create_table(records, rows = 1, cols = 4,
hdr_names = (('№ п/п'),('Наименование параметра'),('Единицы измерения'),('Значение')),
hdr_vars = (id, name, meas, value)):
table = document.add_table(rows, cols)
hdr_cells = table.rows[0].cells
row_cells = table.add_row().cells
for i in range(cols):
hdr_cells[i].text = hdr_names[i]
for hdr_vars in records:
row_cells[i].text = hdr_vars[i]
table.style = 'Table Grid'
create_table(records)
document.save("testing.docx")
Не работает, я понимаю что ошибка в hdr_vars заключается, но не могу пока придумать как это решить. Может быть знает кто правильный подход. Заранее спасибо!
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
Накидал пример функции:
from docx import Document
def create_table(document, headers, rows, style='Table Grid'):
cols_number = len(headers)
table = document.add_table(rows=1, cols=cols_number)
table.style = style
hdr_cells = table.rows[0].cells
for i in range(cols_number):
hdr_cells[i].text = headers[i]
for row in rows:
row_cells = table.add_row().cells
for i in range(cols_number):
row_cells[i].text = str(row[i])
return table
document = Document()
headers = ('№ п/п', 'Наименование параметра', 'Единицы измерения', 'Значение')
records_table1 = (
(0, 'Nan', 'Nan', 0),
(1, 'Первая величина', '-/-', 0),
(2, 'Вторая величина', '-/-', 'Базальт'),
(3, 'Третья величина', 'м^2/ч', 0)
)
table1 = create_table(document, headers, records_table1)
document.add_paragraph()
rows = [
[x, x, x * x] for x in range(1, 10)
]
table2 = create_table(document, ('x', 'y', 'x * y'), rows)
document.save("testing.docx")
Результат:
Автор решения: Андрій Радиш
→ Ссылка
| Показник | Одиниця виміру | Група 1 [400; 600) | Група 2 [600; 800) | Група 3 [800; 1000) | Група 4 [1000; 1200] | Загалом |
| :------------------------------------------ | :------------- | :----------------- | :----------------- | :------------------ | :------------------- | :---------- |
| Кількість підприємств | од. | 6 | 5 | 6 | 3 | 20 |
| Загальний обсяг товарної продукції | тис. грн | 2952 | 3560 | 5324 | 3340 | 15176 |
| Середній обсяг товарної продукції | тис. грн | 492.00 | 712.00 | 887.33 | 1113.33 | 758.80 |
| Загальна собівартість випущеної продукції | тис. грн | 887 | 906 | 1128 | 520 | 3441 |
| Середня собівартість випущеної продукції | тис. грн | 147.83 | 181.20 | 188.00 | 173.33 | 172.05 |
| Середня собівартість на 1 грн товарної продукції | грн / грн | 0.3005 | 0.2545 | 0.2119 | 0.1557 | 0.2267 |
