首页新闻博问专区闪存班级 我的博客我的园子账号设置退出登录注册登录AirPython 公号「AirPython」,每周分享 Python 爬虫、自动化、数据分析、Web、高效率工具等原创干货,欢迎关注。 博客园首页新随笔联系订阅管理随笔 - 24 文章 - 0 评论 - 5最全总结 | 聊聊 Python 办公自动化之 Word(下) 1. 前言关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结最全总结 | 聊聊 Python 办公自动化之 Word(上)最全总结 | 聊聊 Python 办公自动化之 Word(中)本篇文章作为一个办公自动化 Word 篇的一个补充,写写几个比较实用的办公场景包含:页眉页脚处理合并多个文档新增数字索引doc 批量转 docx对比文档差异性特别内容标注替换文字内容2. 页眉页脚每一个页面章节都包含:页眉页脚它可以单独设置,每个页面都不一样;也可以全部设置成与首页一样这个功能,由章节对象中的属性 different_first_page_header_footer 来控制当值为 True 时,代表页眉页脚不同于首页,每个页面章节的页眉、页脚都可以单独设置当值为 False 时,所有页面的页眉、页脚都一样# 1、获取待处理页眉、页脚的章节
header = self.doc.sections[0].header
footer = self.doc.sections[0].footer
self.doc.sections[0].different_first_page_header_footer = True
添加页眉页脚包含两种,分别是:普通页眉页脚、自定义样式的页眉页脚1 - 普通页眉页脚def add_norm_header_and_footer(header, footer, header_content, footer_content):
“”"
增加一个普通的页眉、页脚,并居中显示
:param header_content:
:param footer_content:
:return:
“”"
# 新增/修改页眉、页脚
# 注意:一般页眉、页脚里只有一个段落
header.paragraphs[0].text = header_content
footer.paragraphs[0].text = footer_content
# 居中显示
header.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
add_norm_header_and_footer(header, footer, “我是一个页眉”, “我是一个页脚”)
2 - 自带样式的页眉页脚
2 - 自带样式的页眉页脚def add_custom_style_header_and_footer(header, footer, header_content, footer_content, style):
“”"
新增自定义的页眉、页脚
:param header:
:param footer:
:param header_content:
:param footer_content:
:param style:
:return:
“”"
# 注意:style_type=2,否则会报错
header.paragraphs[0].add_run(header_content, style)
footer.paragraphs[0].add_run(footer_content, style)
style_paragraph = create_style(document=self.doc, style_name=“style5”, style_type=2, font_size=30,
font_color=[0xff, 0x00, 0x00], align=WD_PARAGRAPH_ALIGNMENT.CENTER)
add_custom_style_header_and_footer(header, footer, “我是页眉2”, “我是页脚2”, style_paragraph)
如果想将文档中所有的页眉、页脚删除掉,只需要 2 个步骤:遍历文档中所有页面章节,将其 different_first_page_header_footer 属性值设置为 False设置章节对象页眉页脚的 is_linked_to_previous 属性值为 TruePS:当 is_linked_to_previous 设置为 True 时,页眉页脚会被删除def remove_all_header_and_footer(doc):
“”"
删除文档中所有页眉和页脚
:param doc:
:return:
“”"
for section in doc.sections:
section.different_first_page_header_footer = False
# 当is_linked_to_previous设置为True时,页眉页脚会被删除
section.header.is_linked_to_previous = True
section.footer.is_linked_to_previous = True
3. 合并多个文档日常工作中,经常会遇到将多个 Word 文档合并成一个文件的需求这里,可以使用另外一个 Python 依赖库:docxcompose# 合并多个文件的依赖库
pip3 install docxcompose
使用也非常简单,只需要下面 4 行代码,就能将多个文件进行合并,生成到一个新的文件中去from docxcompose.composer import Composer
def compose_files(self, files, output_file_path):
“”"
合并多个word文件到一个文件中
:param files:待合并文件的列表
:param output_file_path 新的文件路径
:return:
“”"
composer = Composer(Document())
for file in files:
composer.append(Document(file))
# 保存到新的文件中
composer.save(output_file_path)
def create_element(self, name):
return OxmlElement(name)
def create_attribute(self, element, name, value):
element.set(ns.qn(name), value)
def add_page_number(self, run):
“”"
添加页面索引
:param run:
:return:
“”"
fldChar1 = self.create_element(‘w:fldChar’)
self.create_attribute(fldChar1, ‘w:fldCharType’, ‘begin’)
instrText = self.create_element('w:instrText')
self.create_attribute(instrText, 'xml:space', 'preserve')
instrText.text = "PAGE"
fldChar2 = self.create_element('w:fldChar')
self.create_attribute(fldChar2, 'w:fldCharType', 'end')
# run._r:class 'docx.oxml.text.run.CT_R'>
run._r.append(fldChar1)
run._r.append(instrText)
run._r.append(fldChar2)
默认生成的数字索引在页脚左下角,并不美观!因此,这里我们可以使用 第一篇文章 的方法创建一个「文字块样式」,然后以文字块 Run 的形式,添加到页脚的第一个段落中去# 注意:要设置页眉页脚的对齐方式,必须设置到段落上(文字块不能添加对齐方式)
doc.sections[0].footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
style = create_style(document=doc, style_name=“style”, style_type=2, font_size=10,
font_color=[0x00, 0x00, 0x00], font_name=“黑体”)
self.add_page_number(doc.sections[0].footer.paragraphs[0].add_run("", style))
doc.save("./output.docx")
print(‘添加页码索引成功!’)
需要注意的,如果需要设置页面数字索引的对齐方式,必须针对页脚的段落进行设置,修改其 alignment 属性值即可5. doc 转 docxpython-docx 对 doc 格式的文档不太友好,要处理这类文档,我们需要先将它转换为 docx 格式对于 Windows 系统,完全可以使用 win32com 这个模块,用命令去调用 Word 应用,打开源文件后,保存了 docx 格式的文件即可from win32com import client
def doc_to_docx_in_win(path_raw, path_output):
“”"
doc转为docx(win)
:param path_original:
:param path_final:
:return:
“”"
# 获取文件的格式后缀
file_suffix = os.path.splitext(path_raw)[1]
if file_suffix == “.doc”:
word = client.Dispatch(‘Word.Application’)
# 源文件
doc = word.Documents.Open(path_raw)
# 生成的新文件
doc.SaveAs(path_output, 16)
doc.Close()
word.Quit()
elif file_suffix == “.docx”:
shutil.copy(path_raw, path_output)
而对于 Mac/Linux,推荐使用 LibreOffice 去转换文档格式# 转换格式
./soffice --headless --convert-to docx 源文件.doc --outdir /output/path/
PS:LibreOffice 是一款由社区创造的自由免费办公套件,跨平台,内置的 soffice 可以用于文件转换以 Mac OS 为例,我们按下面步骤来操作官网下载 LibreOffice 软件并安装找到 LibreOffice 软件安装目录,将 soffice 命令所在目录配置到环境变量中重启 Pycharm使用 os 模块下的 walk() 函数遍历所有源文件,组成一条 soffice 转换命令执行转换命令import os
source = “./doc/”
dest = “./docx/”
g = os.walk(source)
for root, dirs, files in g:
for file in files:
# 源文件完整路径
file_path_raw = os.path.join(root, file)
print(file_path_raw)
os.system("soffice --headless --convert-to docx {} --outdir {}".format(file_path_raw, dest))
for paragraph in file2.paragraphs:
if “” == paragraph.text.strip():
continue
content2 += paragraph.text + ‘\n’
print(“第二个文档数据如下:\n”, content1.splitlines(keepends=False))
print(“第一个文档数据如下:\n”, content1.splitlines(keepends=False))
接着,使用 Python 中的标准依赖库 difflib 对比文字间的差异,最后生成 HTML 差异报告import codecs
from difflib import HtmlDiff
diff_html = HtmlDiff(wrapcolumn=100).make_file(content1.split("\n"), content2.split("\n"))
with codecs.open(’./diff_result.html’, ‘w’, encoding=‘utf-8’) as f:
f.write(diff_html)
7. 特别内容标注我们经常需要对文档中部分重要内容进行特别标注比如,我们需要对文档中包含「 微信 」的文字块或单元格,标为红色并加粗显示1 - 段落内容只需要遍历出段落中所有文字块 Run,直接修改文字块的 Font 属性即可doc = Document(file)
for paragraph in doc.paragraphs:
for run in paragraph.runs:
if keyword in run.text:
# 修改颜色为红色,并加粗显示
run.font.bold = True
run.font.color.rgb = RGBColor(255, 0, 0)
2 - 表格内容设置满足条件的单元格样式有点特别,需要经过下面 4 个步骤获取单元格对象,获取单元格文本内容,并临时保存清空单元格数据单元格对象追加一个段落和一个文字块 Run,返回一个文字块对象设置文字块对象样式,标红并加粗tables = [table for table in doc.tables]
for table in tables:
for row in table.rows:
for cell in row.cells:
if keyword in cell.text:
# 原内容
content_raw = cell.text
# 清空单元格数据
cell.text = “”
# 追加数据进去,并设置样式
run = cell.paragraphs[0].add_run(content_raw)
run.font.color.rgb = RGBColor(255, 0, 0)
run.font.bold = True
8. 替换文字内容有时候,我们需要将文档中某个关键字全部替换成一个新的内容这时候,我们可以遍历所有段落和表格,使用 replace() 函数对段落文本和单元格内容进行替换def replace_content(self, old_content, new_content):
“”"
替换文档中所有内容
:param old_content:旧的内容
:param new_content:新的内容
:return:
“”"
# 替换段落
for paragraph in self.doc.paragraphs:
if old_content in paragraph.text:
# 替换内容后,重新设置进去
paragraph.text = paragraph.text.replace(old_content, new_content)
# 替换表格
# document.tables[表格索引].rows[行索引].cells[单元格列索引].text = “新的数据”。
tables = [table for table in self.doc.tables]
for table in tables:
for row in table.rows:
for cell in row.cells:
if old_content in cell.text:
# 重新设置单元格内容
cell.text = cell.text.replace(old_content, new_content)
# 保存到一个新的文件中
self.doc.save('./new.docx')
« 上一篇: 最全总结 | 聊聊 Python 办公自动化之 Word(中) posted @ 2020-11-25 20:26 AirPython 阅读(68) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
发表评论 【福利】注册AWS账号,立享12个月免费套餐 编辑预览 7693b08a-a8f6-49f3-f45a-08d88556cc23 Markdown 帮助自动补全 不改了退出 订阅评论 [Ctrl+Enter快捷键提交]
首页 新闻 博问 专区 闪存 班级 【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】从零开始的RPG游戏制作教程,来《魔兽争霸III》共同成长
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【福利】AWS携手博客园为开发者送免费套餐与抵扣券
【推荐】阿里云返场期奖励继续,赢5万现金
相关博文:
· Python中将数据插入到Word模板并生成一份Word
· WordSquares
· HelloWord!
· WordSearchII
· word-break、word-wrap、white-space区别
» 更多推荐…最新 IT 新闻:
· 辛巴燕窝直播争议背后:主播到底是销售者还是广告代言人?
· 『牵手微软、拿下融资』小冰的商业化探索又释放了哪些信号?
· 摁住巨头:腾讯阿里们要小心了?
· 耽美IP到底能撬动多大市场?
· 租客和房东都要打起来了,蛋壳公寓还在微博阴阳怪气
» 更多新闻…
公告 昵称: AirPython
园龄: 8个月
粉丝: 7
关注: 1 +加关注
< 2020年11月> 日一二三四五六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12
搜索 常用链接 我的随笔我的评论我的参与最新评论我的标签我的标签Python(18) 自动化(14) 高效率(11) 工具(6) 办公(6) 办公自动化(6) 办公软件(5) 工作(5) 软件(5) 高效(4) 更多 随笔分类 工具插件(3) 自动化(12) 随笔档案 2020年11月(5) 2020年10月(4) 2020年9月(3) 2020年8月(4) 2020年7月(4) 2020年6月(3) 2020年5月(1) 最新评论1. Re:最全总结 | 聊聊 Python 办公自动化之 Excel(下)@FlashOliver 感谢支持…–AirPython2. Re:最全总结 | 聊聊 Python 办公自动化之 Excel(下)这么好的文章。竟然没人点赞。写的很好–FlashOliver3. Re:App 自动化,Appium 凭什么使用 UiAutomator2?@luckdv 哈哈,对的…–AirPython4. Re:App 自动化,Appium 凭什么使用 UiAutomator2?竟然是meizu–luckdv5. Re:再推荐 5 款私藏的优质 Chrome 插件六一儿童节快乐–凯哥xyz阅读排行榜 1. 推荐 iOS 上的一款黑科技自动化脚本:捷径(2076) 2. 带你用 Python 实现自动化群控设备(789) 3. 如何利用 Python 爬虫实现给微信群发新闻早报?(详细)(450) 4. 最全总结 | 聊聊 Python 办公自动化之 Word(中)(385) 5. 最全总结 | 聊聊 Python 办公自动化之 Excel(上)(372) 评论排行榜 1. 最全总结 | 聊聊 Python 办公自动化之 Excel(下)(2) 2. App 自动化,Appium 凭什么使用 UiAutomator2?(2) 3. 再推荐 5 款私藏的优质 Chrome 插件(1) 推荐排行榜 1. 最全总结 | 聊聊 Python 数据处理全家桶(Sqlite篇)(2) 2. 带你用 Python 实现自动化群控设备(2) 3. 最全总结 | 聊聊 Python 办公自动化之 Word(上)(1) 4. 最全总结 | 聊聊 Python 办公自动化之 Excel(下)(1) 5. 再推荐 5 款私藏的优质 Chrome 插件(1)
Copyright © 2020 AirPython
Powered by .NET 5.0.0 on Kubernetes