Autodoc_excel2pdf_word.py

 avatar
user_2065311
python
a month ago
10 kB
0
Indexable
Never
'''
### Инструкция по Использованию Скрипта для Автоматизации Документов

Этот скрипт помогает автоматизировать процесс заполнения шаблонов Word данными из таблиц Excel и конвертации итоговых документов в формат PDF. Вот пошаговая инструкция:

#### Шаг 1: Выбор Файлов

1. **Выберите Файл Excel**: Запустите скрипт и выберите файл Excel, содержащий данные. Этот файл должен иметь маркеры в комментариях ячеек для данных, которые нужно импортировать.
2. **Выберите Шаблон Word**: Далее выберите шаблон Word, где эти данные будут использованы. В шаблоне маркеры должны быть обозначены в фигурных скобках, например `{имя}`.

#### Шаг 2: Обработка Данных

- Скрипт автоматически прочитает данные из выбранного файла Excel, найдет маркеры и соответствующие им данные.

#### Шаг 3: Заполнение Шаблона

- Затем скрипт вставит данные из Excel в шаблон Word, заменяя маркеры реальными значениями из таблицы.

#### Шаг 4: Сохранение и Конвертация

1. **Сохранение**: Итоговый документ Word будет автоматически сохранен с уникальным именем файла, включающим дату и порядковый номер.
2. **Конвертация в PDF**: После сохранения Word-документа скрипт также конвертирует его в PDF для удобства распространения и чтения.

### Применение

Этот скрипт идеально подходит для создания серий документов, таких как пригласительные, сертификаты, отчеты и любые другие документы, где необходимо вставить персонализированную информацию из таблицы в текстовый документ. Он экономит время, автоматизируя рутинные задачи редактирования документов.

### Важно Знать

- Убедитесь, что ваши файлы Excel и Word правильно подготовлены с маркерами в нужных местах.
- Перед запуском скрипта закройте все открытые документы Excel и Word, чтобы избежать ошибок.

Следуйте этим простым шагам, чтобы упростить и автоматизировать процесс создания документов с помощью данного скрипта.
'''

import openpyxl
from openpyxl import load_workbook
from docx import Document
import os
from PyQt5.QtWidgets import QApplication, QFileDialog
import sys
from docx2pdf import convert
from datetime import datetime

def choose_file(title, filetypes):
    app = QApplication(sys.argv)
    filter_types = " ".join([f"{name} ({ext})" for name, ext in filetypes])
    filepath, _ = QFileDialog.getOpenFileName(None, title, '', filter_types)
    QApplication.quit()
    return filepath

def load_excel_data_with_markers(excel_path):
    workbook = load_workbook(filename=excel_path, data_only=True)
    sheet = workbook.active
    data_with_markers = {}
    for row in sheet.iter_rows(min_row=1, max_col=sheet.max_column, max_row=sheet.max_row):
        for cell in row:
            if cell.comment:  # Проверяем, есть ли заметка в ячейке
                marker = cell.comment.text.strip('{}')  # Извлекаем текст заметки, убирая фигурные скобки
                data_with_markers[marker] = cell.value  # Сохраняем данные с ключом-маркером
    return data_with_markers

def fill_word_template_with_markers(word_template_path, data_with_markers):
    doc = Document(word_template_path)
    for paragraph in doc.paragraphs:
        for marker, value in data_with_markers.items():
            if f'{{{marker}}}' in paragraph.text:
                paragraph.text = paragraph.text.replace(f'{{{marker}}}', str(value))
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                for marker, value in data_with_markers.items():
                    if f'{{{marker}}}' in cell.text:
                        cell.text = cell.text.replace(f'{{{marker}}}', str(value))
    return doc

def generate_unique_filename(base_path, extension):
    date_str = datetime.now().strftime("%d_%m_%Y")
    counter = 1
    while True:
        filename = f"{base_path}{counter:04d} {date_str}.{extension}"
        if not os.path.exists(filename):
            return filename
        counter += 1

def save_doc_and_convert_to_pdf(doc, base_path, extension="docx"):
    unique_word_filename = generate_unique_filename(base_path, extension)
    doc.save(unique_word_filename)
    print(f"Документ Word сохранен как {unique_word_filename}")

    # Для PDF используем то же базовое имя, но другое расширение
    unique_pdf_filename = unique_word_filename.replace(".docx", ".pdf")
    convert(unique_word_filename, unique_pdf_filename)
    print(f"Документ конвертирован в PDF: {unique_pdf_filename}")

# Выбор файлов
excel_path = choose_file("Выберите файл Excel", (("Excel файлы", "*.xlsx;*.xls;*.xlsm"),))
word_template_path = choose_file("Выберите шаблон Word", (("Word документы", "*.docx"),))

# Обработка данных
data_with_markers = load_excel_data_with_markers(excel_path)
word_doc = fill_word_template_with_markers(word_template_path, data_with_markers)

# Сохранение и конвертация
base_path = "документ "  # Базовая часть имени файла для сохранения и конвертации
save_doc_and_convert_to_pdf(word_doc, base_path)
import openpyxl
from openpyxl import load_workbook
from docx import Document
import os
from PyQt5.QtWidgets import QApplication, QFileDialog
import sys
from docx2pdf import convert
from datetime import datetime

def choose_file(title, filetypes):
    app = QApplication(sys.argv)
    filter_types = " ".join([f"{name} ({ext})" for name, ext in filetypes])
    filepath, _ = QFileDialog.getOpenFileName(None, title, '', filter_types)
    QApplication.quit()
    return filepath

def load_excel_data_with_markers(excel_path):
    workbook = load_workbook(filename=excel_path, data_only=True)
    sheet = workbook.active
    data_with_markers = {}
    for row in sheet.iter_rows(min_row=1, max_col=sheet.max_column, max_row=sheet.max_row):
        for cell in row:
            if cell.comment:  # Проверяем, есть ли заметка в ячейке
                marker = cell.comment.text.strip('{}')  # Извлекаем текст заметки, убирая фигурные скобки
                data_with_markers[marker] = cell.value  # Сохраняем данные с ключом-маркером
    return data_with_markers

def fill_word_template_with_markers(word_template_path, data_with_markers):
    doc = Document(word_template_path)
    for paragraph in doc.paragraphs:
        for marker, value in data_with_markers.items():
            if f'{{{marker}}}' in paragraph.text:
                paragraph.text = paragraph.text.replace(f'{{{marker}}}', str(value))
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                for marker, value in data_with_markers.items():
                    if f'{{{marker}}}' in cell.text:
                        cell.text = cell.text.replace(f'{{{marker}}}', str(value))
    return doc

def generate_unique_filename(base_path, extension):
    date_str = datetime.now().strftime("%d_%m_%Y")
    counter = 1
    while True:
        filename = f"{base_path}{counter:04d} {date_str}.{extension}"
        if not os.path.exists(filename):
            return filename
        counter += 1

def save_doc_and_convert_to_pdf(doc, base_path, extension="docx"):
    unique_word_filename = generate_unique_filename(base_path, extension)
    doc.save(unique_word_filename)
    print(f"Документ Word сохранен как {unique_word_filename}")

    # Для PDF используем то же базовое имя, но другое расширение
    unique_pdf_filename = unique_word_filename.replace(".docx", ".pdf")
    convert(unique_word_filename, unique_pdf_filename)
    print(f"Документ конвертирован в PDF: {unique_pdf_filename}")

# Выбор файлов
excel_path = choose_file("Выберите файл Excel", (("Excel файлы", "*.xlsx;*.xls;*.xlsm"),))
word_template_path = choose_file("Выберите шаблон Word", (("Word документы", "*.docx"),))

# Обработка данных
data_with_markers = load_excel_data_with_markers(excel_path)
word_doc = fill_word_template_with_markers(word_template_path, data_with_markers)

# Сохранение и конвертация
base_path = "документ "  # Базовая часть имени файла для сохранения и конвертации
save_doc_and_convert_to_pdf(word_doc, base_path)