Python办公自动化解决world文件批量转换


Posted in Python onSeptember 15, 2021

只要是简单重复的工作,就想办法用 Python 来帮你解决吧,人生苦短,你需要 Python。

Word 是办公软件中使用频率非常高的软件之一了,假如你需要调整 100 个 Word 文档的格式保持统一,或者要把 100 个 Word 全部转换为 pdf,那么你就需要 Python 来帮忙了。

python-docx 库简介

python-docx 是一个可以对 Word 进行读写操作的第三方库,可以读取 Word 内容,可以为 Word 文档添加段落、表格、图片、标题,应用段落样式、粗体和斜体、字符样式。

执行如下安装命令即可完成安装:

pip install python-docx

官方文档: https://python-docx.readthedocs.io/

读取 Word

这里我先创建了一个样例,里面有标题、正文、表格:

Python办公自动化解决world文件批量转换

读取 Word 内容的代码如下:

from docx import Document
def view_docs(docx_file):
    # 打开文档1
    doc = Document(docx_file)
    # 读取每段内容
    pl = [ paragraph.text for paragraph in doc.paragraphs]
    # 输出读取到的内容
    for i in pl:
        print(i)
def view_docs_table(docx_file):
    # 打开文档1
    doc = Document(docx_file)
    # 读取每段内容
    tables = [table for table in doc.tables]
    for table in tables:
        for row in table.rows:
            for cell in row.cells:
                print(cell.text, end='  ')
            print()
        print('\n')
 if __name__ == '__main__':
    view_docs("Python自动化办公实战课.docx")
    view_docs_table("Python自动化办公实战课.docx")

运行结果如下:

Python办公自动化解决world文件批量转换 

写入 Word

现在,用 Python 创建一个和刚才一样的 Word 文档:

from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.table import _Cell
from docx.oxml import OxmlElement 
def set_cell_border(cell: _Cell, **kwargs):
    """
    Set cell`s border
    Usage:
    set_cell_border(
        cell,
        top={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
        bottom={"sz": 12, "color": "#00FF00", "val": "single"},
        start={"sz": 24, "val": "dashed", "shadow": "true"},
        end={"sz": 12, "val": "dashed"},
    )
    """
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
 
    # check for tag existnace, if none found, then create one
    tcBorders = tcPr.first_child_found_in("w:tcBorders")
    if tcBorders is None:
        tcBorders = OxmlElement('w:tcBorders')
        tcPr.append(tcBorders)
    # list over all available tags
    for edge in ('start', 'top', 'end', 'bottom', 'insideH', 'insideV'):
        edge_data = kwargs.get(edge)
        if edge_data:
            tag = 'w:{}'.format(edge)
             # check for tag existnace, if none found, then create one
            element = tcBorders.find(qn(tag))
            if element is None:
                element = OxmlElement(tag)
                tcBorders.append(element)
             # looks like order of attributes is important
            for key in ["sz", "val", "color", "space", "shadow"]:
                if key in edge_data:
                    element.set(qn('w:{}'.format(key)), str(edge_data[key]))
document = Document()
document.styles['Normal'].font.name = u'宋体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
##标题
def add_header(text, level, align='center'):
    title_ = document.add_heading(level=level)
    if align == 'center':
        title_.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 标题居中
    elif align == 'right':
        title_.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT  # 标题居中
    title_run = title_.add_run(text)  # 添加标题内容
    # title_run.font.size = Pt(24)  # 设置标题字体大小
    title_run.font.name = 'Times New Roman'  # 设置标题西文字体
    title_run.font.color.rgb = RGBColor(0, 0, 0)  # 字体颜色
    title_run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')  # 设置标题中文字体
add_header(text='Python自动化办公实战', level=1)
add_header(text='Python基础', level=2, align='left')
document.add_paragraph('Python 是一门面向对象的高级编程语言,易学易用,是自动化办公首选的工具。')
add_header('Python玩转图片', level=2, align='left')
document.add_paragraph('图片是工作中接触较多的媒体文件了,你可能需要图片压缩,加水印,文字识别等操作')
records = (
    ('Python 基础', '00:30', '2021-08-01', ''),
    ('Python 玩转图片', '01:00', '2021-08-01', ''),
    ('Python 玩转 Word', '01:00', '2021-08-01', ''),
)
table = document.add_table(rows=1, cols=4)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '章节'
hdr_cells[1].text = '时长'
hdr_cells[2].text = '日期'
hdr_cells[3].text = '备注'
for cell in hdr_cells:
    set_cell_border(cell,
                    top={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                    bottom={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                    start={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                    end={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                    )
for chapter, time, date, note in records:
    row_cells = table.add_row().cells
    row_cells[0].text = chapter
    row_cells[1].text = time
    row_cells[2].text = date
    row_cells[3].text = note
    for cell in row_cells:
        set_cell_border(cell,
                        top={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                        bottom={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                        start={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                        end={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
                        )
document.save('Python自动化办公实战.docx')

其中,为表格添加边框的代码由于比较复杂,单独做为一个函数来调用。

生成的 Word 文档如下所示,其中表格边框的颜色,标题的颜色,字体大小,样式都是可以设置的:

Python办公自动化解决world文件批量转换

其他操作

添加分页符:

document.add_page_break()

添加图片:

document.add_picture('monty-truth.png', width=Inches(1.25))

设置表格的列宽和行高

'''
设置列宽
可以设置每个单元格的宽,同列单元格宽度相同,如果定义了不同的宽度将以最大值准
'''
table.cell(0,0).width=Cm(10)
#设置行高
table.rows[0].height=Cm(2)

表格字体的设定:

from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
#设置整个表格字体属性
table.style.font.size=Pt(18)
table.style.font.color.rgb=RGBColor(255, 0, 0)
table.style.paragraph_format.alignment=WD_PARAGRAPH_ALIGNMENT.CENTER

合并单元格

cell_1=table.cell(1, 0)
cell_2=table.cell(2, 1)
cell_1.merge(cell_2)

修改文档字体:

from docx import Document
from docx.shared import Pt  #设置像素、缩进等
from docx.shared import RGBColor #设置字体颜色
from docx.oxml.ns import qn
doc = Document("xxx.docx")
for paragraph in doc.paragraphs:
    for run in paragraph.runs:
        run.font.bold = True
        run.font.italic = True
        run.font.underline = True
        run.font.strike = True
        run.font.shadow = True
        run.font.size = Pt(18)
        run.font.color.rgb = RGBColor(255,0,255)
        run.font.name = "黑体"
        # 设置像黑体这样的中文字体,必须添加下面 2 行代码
        r = run._element.rPr.rFonts
        r.set(qn("w:eastAsia"),"黑体")
doc.save("xxx.docx")

行间距调整:

paragraph.paragraph_format.line_spacing = 5.0

段前与段后间距调整:

#段前
paragraph.paragraph_format.space_before = Pt(12)
 
#段后    
paragraph.paragraph_format.space_after = Pt(10)

Word 转 pdf

只需要两行代码就可以将 Word 转 pdf,这里使用的是三方库 docx2pdf 使用前先 pip install docx2pdf

具体代码如下所示:

from docx2pdf import convert
convert("Python自动化办公实战.docx", "Python自动化办公实战.docx.pdf")

如果要对某个目录下的 Word 批量转换为 pdf,可以这样:

from docx2pdf import convert
convert("目录路径/")

批量转换为 pdf 时是否非常方便? 

知道了这些小操作,就可以组装大操作,比如后面可以用 Python 将 Word 转换为 pdf 后作为附件发送邮件给其他人。

最后的话

本文分享了一种读写 Word 的方式,在日常工作中如果是重复性的 Word 操作,可考虑 Python 自动化,有问题请留言交流。阅读原文可以查看 gitee 上的代码。

以上就是Python办公自动化解决world批量转换的详细内容,更多关于Python办公自动化的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python yield 小结和实例
Apr 25 Python
跟老齐学Python之集合(set)
Sep 24 Python
详解Python中的各种函数的使用
May 24 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
python实现文件的分割与合并
Aug 29 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 Python
Python函数式编程中itertools模块详解
Sep 15 #Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 #Python
Python3.10的一些新特性原理分析
Sep 15 #Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 #Python
Python编程编写完善的命令行工具
Sep 15 #Python
python可视化之颜色映射详解
python的变量和简单数字类型详解
Sep 15 #Python
You might like
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
跟老齐学Python之折腾一下目录
2014/10/24 Python
构建Python包的五个简单准则简介
2015/06/15 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
Python pandas库中的isnull()详解
2019/12/26 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
经济学博士求职自荐信范文
2013/11/23 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
好听的队名和口号
2014/06/09 职场文书
航空学院求职信
2014/06/11 职场文书
统计专业自荐书
2014/07/06 职场文书
银行工作心得体会范文
2016/01/23 职场文书
工作建议书范文
2019/07/08 职场文书
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python