Формирование документов WORD из списков python

У меня есть шаблон введите сюда описание изображения

Есть 2 списка

['2021-04-30', '2021-05-02', '2021-05-04', '2021-05-06']

[1500, 450, 750, 900]

Код:

doc = DocxTemplate('Шаблон.docx')
context = {'expirationdate': date, 'price': price, 'finalprice': pricesum}
doc.render(context)
doc.save('restyled.docx')

Я получаю: введите сюда описание изображения

Как мне получить такой документ? введите сюда описание изображения

Пробую вот так

х=0
while х<len(date):
    doc = DocxTemplate('Шаблон.docx')
    context = {'expirationdate': date[х], 'price': price[х], 'finalprice': pricesum}
    doc.render(context)
    doc.save('restyled.docx')

Но тогда получаю только первый элемент списка и только одну строку введите сюда описание изображения


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

Автор решения: insolor

На основе второй части ("Dynamic table") вот этого ответа: https://stackoverflow.com/a/54983642/4752653 (код там взят из одного из тестов к python-docx-template)

Шаблон делаем такого вида:

Шаблон

Строки таблицы, обрамленные в tr for/tr endfor, будут дублироваться столько раз, сколько элементов в списке по ключу 'tbl_contents'. Для дублирования колонок нужно использовать tc for/tc endfor вместо tr for/tr endfor (как в примере в данном шаблоне).

Код заполнения:

from docxtpl import DocxTemplate

doc = DocxTemplate('template.docx')

dates = ['2021-04-30', '2021-05-02', '2021-05-04', '2021-05-06']
prices = [1500, 450, 750, 900]

# Формируем список вида
# [{'expirationdate': '2021-04-30', 'price': 1500},
#  {'expirationdate': '2021-05-02', 'price': 450}, ...]
tbl_contents = [{'expirationdate': expirationdate, 'price': price}
                for expirationdate, price in zip(dates, prices)]

context = {
    'tbl_contents': tbl_contents,
    'finalprice': sum(prices)
}

doc.render(context)
doc.save('result.docx')

Результат: Результат

→ Ссылка