<自动化办公> Python 操控 Word
虽然Word不好用, 但还必须得用它,
python-docx
是专门用于编辑Word文档的一个工具库, 它有两大用途, 自动化生成word文档 and 自动化修改文档
python word
1. 自定义样式
自定义样式
python可以自定义三类样式
- 段落样式
- 字符样式
- 表格样式(一般用不到)
这三类样式的创建方式基本一致, 只是创建参数 略有不同(1为段落样式, 2为字符样式, 3为表格样式)
以设置段落样式为例
# 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式) UserStyle1 = document.styles.add_style('UserStyle1', 1) # 设置字体尺寸 UserStyle1.font.size = Pt(40) # 设置字体颜色 UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00) # 居中文本 UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 设置中文字体 UserStyle1.font.name = '微软雅黑' UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
2.理解结构关系
结构关系
- 往文档中插入文本内容, 首先要插入一个段落, 段落后面可追加字符, 但文档不能直接插入字符
- 段落之间会自动以 回车符号 分隔
- 段落 和 字符 可 各自设置独立的样式
实例: 插入段落, 插入段落后追加字符
# 使用自定义段落样式 document.add_paragraph('自定义段落样式', style = UserStyle1) # 使用自定义字符样式 document.add_paragraph('').add_run('正月里采花无哟花采,二月间采花花哟正开,二月间采花花哟正开。三月里桃花红哟似海,四月间葡萄架哟上开,四月间葡萄架哟上开。', style = UserStyle2)
3. 插入图片
python-docx支持将图片插入文档, 且可以设置图片大小
插入图片
实例代码:
document.add_picture('少女17087938.jpg', width=Inches(5))
4.插入列表
插入列表
插入有序列表
document.add_paragraph('把冰箱门打开', style='List Number') document.add_paragraph('把大象装进去', style='List Number') document.add_paragraph('把冰箱门关上', style='List Number')
插入无序列表
document.add_paragraph('天地匆匆 惊鸿而过 路有千百个', style='List Bullet') document.add_paragraph('遑遑无归 闲云逸鹤 人间红尘过', style='List Bullet') document.add_paragraph('引势而流 鸿门乱局 各有各选择', style='List Bullet') document.add_paragraph('乾震坎艮 坤巽离兑 定一切生克', style='List Bullet')
5.插入表格
插入表格
把表格看做二维数组, 然后往数组中填数据
rows_num = 5 cols_num = 6 table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid') for r in range(rows_num): for c in range(cols_num): table.cell(r, c).text = "第{r}行{c}列".format(r = r+1, c = c+1)
完整源码:
from docx import Document from docx.shared import Inches from docx.dml.color import ColorFormat from docx.shared import Pt from docx.shared import RGBColor from docx.oxml.ns import qn from docx.enum.style import WD_STYLE_TYPE from docx.enum.text import WD_ALIGN_PARAGRAPH def main(): # 创建文档对象 document = Document() # 设置默认字体 document.styles['Normal'].font.name = '微软雅黑' document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式) UserStyle1 = document.styles.add_style('UserStyle1', 1) # 设置字体尺寸 UserStyle1.font.size = Pt(40) # 设置字体颜色 UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00) # 居中文本 UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 设置中文字体 UserStyle1.font.name = '微软雅黑' UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 创建自定义字符样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式) UserStyle2 = document.styles.add_style('UserStyle2', 2) # 设置字体尺寸 UserStyle2.font.size = Pt(15) # 设置字体颜色0c8ac5 UserStyle2.font.color.rgb = RGBColor(0x0c, 0x8a, 0xc5) # 设置段落样式为宋体 UserStyle2.font.name = '宋体' UserStyle2._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 使用自定义段落样式 document.add_paragraph('自定义段落样式', style = UserStyle1) # 使用自定义字符样式 document.add_paragraph('').add_run('正月里采花无哟花采,二月间采花花哟正开,二月间采花花哟正开。三月里桃花红哟似海,四月间葡萄架哟上开,四月间葡萄架哟上开。', style = UserStyle2) # 设置粗体字 document.add_paragraph('设置粗体字:').add_run('粗体字').bold = True # 设置斜体字 document.add_paragraph('设置斜体字:').add_run('斜体字').italic = True # 设置字号50 document.add_paragraph('设置字号50:').add_run('50').font.size = Pt(50) # 设置字体颜色为 af2626 document.add_paragraph('设置字体颜色:').add_run('颜色').font.color.rgb = RGBColor(0xaf, 0x26, 0x26) # 样式叠加: 将字体改到30号并且将字体改成特定颜色; doubleStyle = document.add_paragraph('同时设置文字颜色和字号:').add_run('颜色和尺寸') doubleStyle.font.size = Pt(30) doubleStyle.font.color.rgb = RGBColor(0xaf, 0x26, 0x26) # 添加分页符 document.add_page_break() # 创建 有序列表 document.add_paragraph('').add_run('有序列表').font.size = Pt(30) document.add_paragraph('把冰箱门打开', style='List Number') document.add_paragraph('把大象装进去', style='List Number') document.add_paragraph('把冰箱门关上', style='List Number') # 创建 无序列表 document.add_paragraph('').add_run('无序列表').font.size = Pt(30) document.add_paragraph('天地匆匆 惊鸿而过 路有千百个', style='List Bullet') document.add_paragraph('遑遑无归 闲云逸鹤 人间红尘过', style='List Bullet') document.add_paragraph('引势而流 鸿门乱局 各有各选择', style='List Bullet') document.add_paragraph('乾震坎艮 坤巽离兑 定一切生克', style='List Bullet') # 添加分页符 document.add_page_break() # 添加图片 document.add_paragraph('').add_run('添加图片').font.size = Pt(30) document.add_picture('少女17087938.jpg', width=Inches(5)) # 添加分页符 document.add_page_break() document.add_paragraph('').add_run('创建表格').font.size = Pt(30) # 创建两行两列的表格 rows_num = 5 cols_num = 6 table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid') for r in range(rows_num): for c in range(cols_num): table.cell(r, c).text = "第{r}行{c}列".format(r = r+1, c = c+1) # 保存文档 document.save('Python生成的文档.docx') if __name__ == '__main__': main()
将源码保存为单独的python文件后,安装python-docx, 找一张图片,命名为
少女17087938.jpg
, 将图片与python文件放到同一个目录, 然后再python3环境下运行python文件即可! 最后附测试图片一张:少女17087938.jpg
最终效果:最终效果.png
自动化修改文档
保留格式并替换
实例: 将当前目录下, 所有docx文件内的"海南大学", 替换为"Hainan University", 并将新文件添加前缀
new
后, 保存到当前目录下转换前
转换后
终端打印
import docx import os import re # 传入三个参数, 旧字符串, 新字符串, 文件对象 def replace_text(old_text, new_text, file): # 遍历文件对象 for f in file.paragraphs: # 如果 旧字符串 在 某个段落 中 if old_text in f.text: print("替换前:", f.text) # 将段落存入 inline inline = f.runs # 遍历 段落 生成 i for i in inline: # 如果 旧字符串 在 i 中 if old_text in i.text: # 替换 i.text 内文本资源 text = i.text.replace(old_text, new_text) i.text = text print("替换后===>", f.text) def main(): # 获取当前目录下所有的文件名列表 old_file_names = os.listdir() # 获取所有docx文件名列表 docx_file_names = [] for old_file_name in old_file_names: if re.match(r'^[^~].*\.docx', old_file_name): print(old_file_name) docx_file_names.append(old_file_name) for docx_file_name in docx_file_names: try: # 获取文件对象 file=docx.Document(docx_file_name) # 三个参数: 旧的字符串, 新的字符串, 文件对象 print("开始替换:", docx_file_name) replace_text('海南大学', 'Hainan University', file) file.save('new_'+docx_file_name) print(docx_file_name, "替换成功") except: print(docx_file_name, "替换失败") pass if __name__ == '__main__': main()
关于Python操控PPT:https://www.jianshu.com/p/5b294515b480

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
XGboost数据比赛实战之调参篇(完整流程)
这一篇博客的内容是在上一篇博客Scikit中的特征选择,XGboost进行回归预测,模型优化的实战的基础上进行调参优化的,所以在阅读本篇博客之前,请先移步看一下上一篇文章。 我前面所做的工作基本都是关于特征选择的,这里我想写的是关于XGBoost参数调整的一些小经验。之前我在网站上也看到很多相关的内容,基本是翻译自一篇英文的博客,更坑的是很多文章步骤讲的不完整,新人看了很容易一头雾水。由于本人也是一个新手,在这过程中也踩了很多大坑,希望这篇博客能够帮助到大家!下面,就进入正题吧。 首先,很幸运的是,Scikit-learn中提供了一个函数可以帮助我们更好地进行调参: sklearn.model_selection.GridSearchCV 常用参数解读: estimator:所使用的分类器,如果比赛中使用的是XGBoost的话,就是生成的model。比如: model = xgb.XGBRegressor(**other_params) param_grid:值为字典或者列表,即需要最优化的参数的取值。比如:cv_params = {'n_estimators': [550, 575,...
- 下一篇
Java实现单向链表基本功能
一、前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用~ 本文主要讲解单链表的基础知识点,做一个简单的入门~如果有错的地方请指正 二、回顾与知新 说起链表,我们先提一下数组吧,跟数组比较一下就很理解链表这种存储结构了。 2.1回顾数组 数组我们无论是C、Java都会学过: 数组是一种连续存储线性结构,元素类型相同,大小相等 数组的优点: 存取速度快 数组的缺点: 事先必须知道数组的长度 插入删除元素很慢 空间通常是有限制的 需要大块连续的内存块 插入删除元素的效率很低 2.2链表说明 看完了数组,回到我们的链表: 链表是离散存储线性结构 n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。 链表优点: 空间没有限制 插入删除元素很快 链表缺点: 存取速度很慢 链表相关术语介绍,我还是通过上面那个图来说明吧: 确定一个链表我们只需要头指针,通过头指针就可以把整个链表都能推导出来了~ 链表又分了好几类: 单向链表 一...
相关文章
文章评论
共有0条评论来说两句吧...