Autodoc_excel2pdf_word.py
user_2065311
python
a year ago
10 kB
3
Indexable
''' ### Инструкция по Использованию Скрипта для Автоматизации Документов Этот скрипт помогает автоматизировать процесс заполнения шаблонов 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)
Editor is loading...