Autodoc_excel2pdf_word.py
user_2065311
python
2 years ago
10 kB
5
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...