批量生成word文档
安装openpyxl模块:
pip install openpyxl
安装python-docx模块:
pip install python-docx
openpyxl模块可以读写扩展名为.xlsx/.xlsm/.xltx/.xltm的Excel文件。
python-docx模块可以读写扩展名为.docx的Word文档,但不能处理扩展名为.doc的Word文档。
import re
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT
from openpyxl import load_workbook
from docx import Document
def info_update(doc, old_info, new_info):
"""
文档内容替换
:param doc: Word模板文档
:param old_info: 源文本
:param new_info: 新文本
:return:
"""
# 遍历Word文档中的所有段落
for para in doc.paragraphs:
# 遍历每个段落中的run对象
for run in para.runs:
# 替换run对象的文本内容
# run.text = run.text.replace(r'《'+old_info+'》', new_info)
run.text = run.text.replace(old_info, new_info)
run.text = re.sub(r'[《》]', '', run.text)
# 遍历Word文档中的所有表格
for table in doc.tables:
# 遍历表格中的所有行
for row in table.rows:
# 遍历行中的所有单元格
for cell in row.cells:
# 替换单元格内容
cell.text = cell.text.replace('《' + old_info + '》', new_info)
# 设置表格中的内容居中显示
# 计算表格的rows和cols的长度
rows = len(table.rows)
cols = len(table.columns)
# 循环将每一行,每一列都设置为居中
for r in range(rows):
for c in range(cols):
table.cell(r, c).vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER # 垂直居中
table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER # 水平居中
wb = load_workbook('学生成绩表.xlsx') # 打开工作簿
ws = wb.active # 激活工作簿中的工作表
遍历工作表的行,从第2行开始
for row in range(2, ws.max_row + 1):
doc = Document('成绩通知书.docx') # 创建文档对象
# 遍历工作表的列
for col in range(1, ws.max_column + 1):
# 读取当前列的第一行,即列标题,单元格的值转换成字符串
old_info = str(ws.cell(row=1, column=col).value)
# 读取当前列的数据,单元格的值需要转换成字符串
new_info = str(ws.cell(row=row, column=col).value)
# 进行内容替换
info_update(doc, old_info, new_info)
student_name = str(ws.cell(row=row, column=1).value)
doc.save(f'scores\\成绩单--致{student_name}.docx')
将word文档转化为PDF文档
安装pywin32模块:
pip install pywin32
from pathlib import Path
from win32com.client import constants, gencache
创建Path对象
路径要使用绝对路径
src_folder = Path(r'E:\pythonProject\python办公自动化\第5章 自动化处理Word文档\scores')
output_folder = Path(r'E:\pythonProject\python办公自动化\第5章 自动化处理Word文档\PDF')
判断输出目录是否存在
if not output_folder.exists():
# 不存在则创建
output_folder.mkdir(parents=True)
file_list = list(src_folder.glob('*[.docx|.doc]')) # 获得要转换的Word文档的路径列表
word = gencache.EnsureDispatch('Word.Application') # 创建Word程序对象
word = win32com.client.Dispatch('Word.Application')
for word_path in file_list:
# 生成转换后的PDF文件的保存路径
pdf_path = output_folder / word_path.with_suffix('.pdf').name # with_suffix()返回文件后缀已更改的新路径
# 判断pdf文件路径是否已存在
if pdf_path.exists():
continue
else:
# 路径需要是绝对路径,否则会报错
doc = word.Documents.Open(str(word_path), ReadOnly=1) # 打开Word文档
# 设置导出格式为pdf
doc.ExportAsFixedFormat(str(pdf_path), constants.wdExportFormatPDF) # 将打开的Word文档另存为PDF文件,保存到给定的路径
doc.Close() # 关闭Word文档
word.Quit() # 关闭Word程序窗口