Python实现自动化处理Word文档的方法详解
作者:梦里逆天 发布时间:2022-05-24 00:33:59
标签:Python,自动化,处理,Word
使用Python实现Word文档的自动化处理,包括批量生成Word文档、在Word文档中批量进行查找和替换、将Word文档批量转换成PDF等。
1. 批量生成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')
测试文件:
测试效果:
2. 将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程序窗口
测试文件:
测试效果:
3. 在Word文档中批量标记关键词
import win32com.client as win32
# 路径要使用绝对路径
input_file = r'E:\pythonProject\python办公自动化\第5章 自动化处理Word文档\劳动合同.docx'
output_file = r'E:\pythonProject\python办公自动化\第5章 自动化处理Word文档\劳动合同1.docx'
word = win32.gencache.EnsureDispatch('Word.Application') # 打开一个Word程序窗口
word.Visible = False # 设置窗口为隐藏状态,即在后台运行
cs = win32.constants # 导入Word开发接口提供的预设常量集合
doc = word.Documents.Open(input_file) # 打开要处理的Word文档
# 设置要标记的关键词列表
keyword_list = ['报酬', '保险', '培训', '解除', '终止']
# 设置每个关键词的突出显示颜色
color_list = [cs.wdYellow, 14, cs.wdGreen, cs.wdRed, 13]
"""
值--颜色常量--含义:
1--wdBlack--黑色
2--wdBlue--蓝色
3--wdTurquoise--青绿色
4--wdBrightGreen--鲜绿色
5--wdPink--粉红色
6--wdRed--红色
7--wdYellow--黄色
8--wdWhite--白色
9--wdDarkBlue--深蓝色
10--wdTeal--青色
11--wdGreen--绿色
12--wdViolet--紫罗兰色
13--wdDarkRed--深红色
14--wdDarkYellow--深黄色
15--wdGray50--50%灰色
16--wdGray25--25%灰色
"""
for w, c in zip(keyword_list, color_list): # 使用zip()函数将关键词列表和标记颜色列表中的元素一一配对分别赋给w和c
word.Options.DefaultHighlightColorIndex = c # 设置突出显示的颜色
findObj = word.Selection.Find # 创建Find对象
findObj.ClearFormatting() # 清除查找文本的格式,表示查找文本时不限制文本格式
findObj.Text = w # 设置查找文本
findObj.Replacement.ClearFormatting() # 清除替换文本的格式设置
findObj.Replacement.Text = w # 将替换文本设置为与查找文本相同的值
findObj.Replacement.Font.Bold = True # 设置替换文本的格式为加粗
findObj.Replacement.Font.Italic = True # 设置替换文本的格式为斜体
findObj.Replacement.Font.Underline = cs.wdUnderlineDouble # 设置替换文本加双下划线
findObj.Replacement.Highlight = True # 设置替换时对文本做突出显示
findObj.Execute(Replace=cs.wdReplaceAll) # 执行查找和替换,wdReplaceAll表示全部替换
# 将处理后的word文档以新的文件名另存
doc.SaveAs(output_file)
# 关闭Word文档
doc.Close()
# 关闭Word程序窗口
word.Quit()
测试效果:
4. 在Word文档中批量替换关键词
from pathlib import Path
import win32com.client as win32
# 创建Path对象
src_folder = Path(r'E:\pythonProject\python办公自动化\第5章 自动化处理Word文档\Files')
output_folder = Path(r'E:\pythonProject\python办公自动化\第5章 自动化处理Word文档\output_files')
# 判断输出文件夹是否存在
if not output_folder.exists():
# 创建文件夹
output_folder.mkdir(parents=True)
file_list = list(src_folder.glob('*.docx')) # 获得给定文件的word文档路径列表
# 以替换前的关键词作为建,以替换后的内容作为值,建立字典
replace_dict = {'确定': '确认', '订立': '签订', '执行': '履行'}
word = win32.gencache.EnsureDispatch('Word.Application') # 打开Word程序窗口
word.Visible = False # 设置窗口隐藏
cs = win32.constants # 导入Word开发接口提供的预设常量集合
for file in file_list:
doc = word.Documents.Open(str(file)) # 打开Word文档
print(file.name)
for old_txt, new_txt in replace_dict.items():
findObj = word.Selection.Find # 创建Find对象
findObj.ClearFormatting() # 清除查找文本的格式,表示查找文本时不限制文本格式
findObj.Text = old_txt # 设置查找文本
findObj.Replacement.ClearFormatting() # 清除替换文本的格式设置
findObj.Replacement.Text = new_txt # 设置替换文本
# 判断Find对象的Execute()函数在文档中是否找到关键词
if findObj.Execute(Replace=cs.wdReplaceAll): # 执行查找和替换,wdReplaceAll表示全部替换
print(f'{old_txt}-->{new_txt}')
new_file = output_folder / file.name # 生成输出文件的路径
doc.SaveAs(str(new_file)) # # 将处理后的word文档以新的文件名另存
doc.Close() # 关闭Word文档
word.Quit() # 关闭Word程序窗口
测试效果:
来源:https://blog.csdn.net/username666/article/details/126550415


猜你喜欢
- 一、问题原因(如果不是第一次使用pycharm,我觉得可以跳过这一章)我是升级以后,在用pycharm打开以前的项目就出现报错了;很明显是环
- 说明:本例改编自《Python编程快速上手》。例子很简单我就不多说了 直接上代码,给初学python练手用。给你6次机会猜对一个预先生成好的
- 本文实例讲述了Python获取基金网站网页内容、使用BeautifulSoup库分析html操作。分享给大家供大家参考,具体如下:利用 ur
- general_log(查询日志)开启和关闭一、查询日志开启方法一:mysql>set global general_log_file
- 1、首先介绍简单的try......except尝试运行的放例如下面的图和代码来简单介绍下:def test(x,y): pri
- 语法:Void header(string $string[,bool $replace=true [, int $http_respons
- 1 概述一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,也就是不可拆分;第二范式
- 其实老早之前就已经做完了,这次稍微改进一下浏览地址:http://www.healdream.com/upload/html/autocli
- 部署.net6项目到docker【1】新建.net6 mvc或webapi项目;【2】在mvc或webapi项目的根目录下创建Dockerf
- 本文实例为大家分享了python遗传算法的具体代码,供大家参考,具体内容如下1、基本概念遗传算法(GA)是最早由美国Holland教授提出的
- 游戏规则:一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。有以下几种牌:豹子:三张一样的牌,如3张6.顺金:又称同花顺,即3张
- 报错信息最近闲来无事,用python的tkinter库开发了一款带日程提醒的万年历桌面程序。在程序开发结束开始打包时,却发现一直报错PyIn
- 利用原生js实现一个简易的计算器(附详细注释),供大家参考,具体内容如下<!DOCTYPE html><html lang
- 今天在写PHP程序的时候总是出现这样的错误:Parse error: syntax error, unexpected end of fil
- sql 使用系统存储过程 sp_send_dbmail 发送电子邮件语法:sp_send_dbmail [ [ @profile_name
- 本文实例为大家分享了Vue实现简单跑马灯特效的具体代码,供大家参考,具体内容如下效果:点击按钮让文字动起来,点击停止按钮让文字停止知识点:s
- 本文实例讲述了python获得一个月有多少天的方法。分享给大家供大家参考。具体分析如下:在python的datetime模块中没有一个月有多
- 这篇文章主要介绍了Python JSON编解码方式原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- #coding:utf-8"""__new__和__init__到底是怎么一回事,看下面的代码如果类没有定义_
- 在计算loss的时候,最常见的一句话就是tf.nn.softmax_cross_entropy_with_logits,那么它到底是怎么做的