Задать вопрос
@Max8k

Как автоматизировать заполнение бланка docx, меняя лишь часть текста?

Есть А4 бланк заявления (в docx), который нужно с телефона отправлять по вацапу начальнику. Меняются только дата, фио и номер. Как правило, отправлять нужно побыстрее и по нескольку раз в день.
Ф.И.О. клиента почти всегда разные, дата всегда сегодняшняя, а номеров всего 10, изредка бывают другие.

Со смартфона заполнять через офисный редактор не слишком удобно, да и ненароком можно что-то сбить, не то стереть и тд. Можно ли как-то автоматизировать процесс?
  • Вопрос задан
  • 44 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@tifco
Вероятно, через макросы, через встроенный в Офис VBA (Visual Basic for Applications) это положено делать.
Ответ написан
Комментировать
@Robyn_rock
Что-то умею
import datetime
from docx import Document

def replace_shortcodes_in_run(run, replacements):
    for key, val in replacements.items():
        if key in run.text:
            run.text = run.text.replace(key, val)

def replace_shortcodes_in_paragraph(paragraph, replacements):
    for run in paragraph.runs:
        replace_shortcodes_in_run(run, replacements)

def replace_shortcodes_in_table(table, replacements):
    for row in table.rows:
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                replace_shortcodes_in_paragraph(paragraph, replacements)

def replace_shortcodes(doc, replacements):
    for paragraph in doc.paragraphs:
        replace_shortcodes_in_paragraph(paragraph, replacements)
    
    for table in doc.tables:
        replace_shortcodes_in_table(table, replacements)

def main():
    # Открыть файл template.docx
    doc = Document('template.docx')

    # Запросить у пользователя name и number
    name = input("Введите имя: ")
    number = input("Введите номер: ")

    # Запросить дату или использовать текущую дату, если не указана
    date_input = input("Введите дату (оставьте пустым для текущей даты): ")
    if date_input:
        date = date_input
    else:
        date = datetime.datetime.now().strftime("%Y-%m-%d")

    # Замены
    replacements = {
        '{name}': name,
        '{date}': date,
        '{number}': number
    }

    # Заменить шорткоды в документе
    replace_shortcodes(doc, replacements)

    # Сохранить документ как template_{date}.docx
    new_filename = f'template_{date}.docx'
    doc.save(new_filename)
    print(f'Документ сохранен как {new_filename}')

if __name__ == "__main__":
    main()


Могу доработать, если надо, под тебя. Можно всё это обвесить всякими удобствами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы