Использование pandas для автоматической генерации документов по шаблону

Текущий код создаёт лишь один файл на выходе и меняет только [свидетельство]. Не могу определить в чём проблема. Все столбцы в excel-файле имеют название, все ключи соответствуют коду.

excel_file = 'Book1.xlsx'
column_names = [
    'ФИО_должника', 'адрес', 'дата_рождения', 'паспорт', 'задолженность',
    'пошлина', 'период_задолженности', 'населённый_пункт', 'улица',
    'дом', 'квартира', 'кадастровый_номер', 'свидетельство'
]
df = pd.read_excel(excel_file, names=column_names, header=None)

print(df.columns)


template_path = 'Заявление.docx'
output_folder = 'output_docs'
os.makedirs(output_folder, exist_ok=True)

def create_document(row):
    doc = Document(template_path)
    output_path = os.path.join(output_folder, f"Заявление_{row['ФИО_должника']}.docx")

    for paragraph in doc.paragraphs:
        if '[ФИО_должника]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[ФИО_должника]', str(row['ФИО_должника']))
        if '[место_жительства]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[место_жительства]', str(row['место_жительства']))
        if '[дата_и_место_рождения]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[дата_и_место рождения]', str(row['дата_и_место_рождения']))
        if '[данные_паспорта]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[данные_паспорта]', str(row['паспорт']))
        if '[размер_задолженности]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[размер_задолженности]', str(row['задолженность']))
        if '[пошлина]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[пошлина]', str(row['пошлина']))
        if '[период_задолженности]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[период_задолженности]', str(row['период_задолженности']))
        if '[населённый_пункт]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[населённый_пункт]', str(row['населённый_пункт']))
        if '[улица]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[улица]', str(row['улица']))
        if '[дом]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[дом]', str(row['дом']))
        if '[квартира]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[квартира]', str(row['квартира']))
        if '[кадастровый_номер]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[кадастровый_номер]', str(row['кадастровый_номер']))
        if '[свидетельство]' in paragraph.text:
            paragraph.text = paragraph.text.replace('[свидетельство]', str(row['свидетельство']))

    doc.save(output_path)

for index, row in df.iterrows():
    try:
        create_document(row)
        print(f"Документ для {row['ФИО_должника']} успешно создан.")
    except Exception as e:
        print(f"Ошибка при создании документа для {row['ФИО_должника']}: {e}")

print("Документы успешно созданы и сохранены в папку 'output_docs'.")

Формат данных в excel: название столбцов [ФИО_должника] [адрес] [размер задолженности] далее данные

Так выглядит шаблон заявления

введите сюда описание изображения

Пробовал переименовывать названия столбцов в excel, менять внешний цикл в программе, ничего не выходит


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

Автор решения: Алексей Р

Протестировал ваш код. Если поправить названия во избежание ошибок, то ваш код отработал нормально. Я немного сократил и структурировал код, протестировал. Комментарии в коде.

def create_document(row, column_names, template_path, output_folder, counter):
    doc = Document(template_path)

    for paragraph in doc.paragraphs:
        text = paragraph.text  # читаем абзац 1 раз
        for k, v in column_names.items():  # и в цикле
            text = text.replace(k, row[v])  # заменяем маркеры на значения, сопоставляя из словаря
        if text != paragraph.text:  # проверяем, если в исходном тексте абзаца что-то изменлось
            paragraph.text = text  # то записываем результат в документ

    fio = row['ФИО_должника']
    output_path = os.path.join(output_folder, f"Заявление_{fio}.docx")
    doc.save(output_path)
    print(f"Документ для {fio} успешно создан.")
    counter[0] += 1  # приращиваем счетчик успешно сохраненных документов


column_names = {
    '[ФИО_должника]': 'ФИО_должника', '[место_жительства]': 'место_жительства', '[дата_и_место рождения]': 'дата_рождения', '[данные_паспорта]': 'паспорт',
    '[размер_задолженности]': 'задолженность', '[пошлина]': 'пошлина', '[свидетельство]': 'свидетельство'
}  # словарь для сопоставления маркеров в тексте и названий полей в таблице

excel_file = r'c:\test\Book1.xlsx'
template_path = r'c:\test\Заявление.docx'
output_folder = r'c:\test\output_docs'

os.makedirs(output_folder, exist_ok=True)

counter = [0]
pd.read_excel(excel_file).astype(str).apply(create_document, axis=1, args=(
column_names, template_path, output_folder, counter))  # читаем данные, сразу преобразуем все в текст и применяем к каждой строке фрейма функцию с доп аргументами
print(f"{counter[0]} документов успешно создано и сохранены в папку {output_folder}.")
Документ для Иванов успешно создан.
Документ для Петров успешно создан.
Документ для Сидоров успешно создан.
3 документов успешно создано и сохранены в папку c:\test\output_docs.

Тестовая таблица:

введите сюда описание изображения

→ Ссылка