Автоматизация создания таблиц 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      |

→ Ссылка