这是 Python 小专栏的第 ⑤ 期
在大家日常工作和学习中,Word 和 Excel 文档是经常打交道的。Python 中有很多库提供了对文档和表格的操作处理功能,借助这些库,可以轻松实现文档表格的生成和修改。
想象这样的场景:从公司系统中导出的 Excel 数据,要填到 Word 文档中做成报告的形式。如果每天都要这样做,人工去复制各个数据不仅麻烦低效,也很容易出错。借助 Python,只需很少的代码,就能轻松实现这些操作。
今天给大家介绍几个非常实用的 Word 和 Excel 处理的库。篇幅限制,不会对每个库都详细讲解,大家可以搜索库的名字,找到相关的博客文章,但更建议熟悉英文阅读的小伙伴参考给出的官方文档来学习使用。
python-docx
文档地址:http://python-docx.readthedocs.io/en/latest/
这是一个用来生成和修改 Word 文档的库,你可以添加标题、段落、图片、表格,设置格式。
例如官方示例中,通过下面的代码,你就能生成一份如图所示的 Word 文档:
from docx import Documentfrom docx.shared import Inches
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = Truep.add_run(' and some ')
p.add_run('italic.').italic = Truedocument.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph( 'first item in unordered list', style='ListBullet')
document.add_paragraph( 'first item in ordered list', style='ListNumber')
document.add_picture('monty-truth.png', width=Inches(1.25))
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'hdr_cells[1].text = 'Id'hdr_cells[2].text = 'Desc'for item in recordset:
row_cells = table.add_row().cells
row_cells[0].text = str(item.qty)
row_cells[1].text = str(item.id)
row_cells[2].text = item.desc
document.add_page_break()
document.save('demo.docx')
# 代码来源:官方文档
生成的文档效果:
python-docx-template
文档地址:http://docxtpl.readthedocs.io/en/latest/
这也是操作 Word 文档的库,而且是在上一个 python-docx 的基础之上开发的。主要原因是作者觉得 python-docx 库在生成 Word 文档方面很强大,但是在批量查找替换方面做的不够好。
这个库的 Python 包名叫 docxtpl,借助它,你可以在 Word 文档中使用 jinja2 的模板语法来准备一份 Word 模板,然后在 Python 中传入相关参数就能实现查找替换,批量生成 Word 文档。(熟悉前端开发的小伙伴大概都知道网页的模板引擎,jinja2 是 Python web 开发中广泛使用的一种模板引擎。具体语法请自行搜索)
例如,在 Word 中,可以写这样一段内容:
然后使用 docxtpl 写这段代码:
from docxtpl import DocxTemplate
doc = DocxTemplate("my_word_template.docx")
context = { 'hello' : "今天天气真好" }
doc.render(context)
doc.save("generated_doc.docx")
就能生成下图的 Word 文档。其中 {{hello}} 的位置,替换成了 hello 参数的值。而 你好 这两个字,由于参数中没有 today,不符合 if 的判断条件,就不会输出。
借助 docxtpl,你可以在一份预先排好版的 Word 模板中,预留一些标签占位,然后使用实际数据 render 一下这份模板,就能把数据填进去了。
xlrd, xlwt,xlutils
文档地址:
http://xlrd.readthedocs.io/en/latest/
http://xlwt.readthedocs.io/en/latest/
http://xlutils.readthedocs.io/en/latest/
主要用来处理 Excel 文档的几个库, xlrd 用来读, xlwt 用来写, xlutils 用于做复制、筛选等针对文档文件的操作。
代码示例:
import xlrdimport xlwtimport xlutilsworkbook = xlrd.open_workbook('myexcel.xls')
worksheet = workbook.sheet_by_index(0)
data = worksheet.cell_value(0,0)wb = xlwt.Workbook()
sh = wb.add_sheet('Sheet1')
sh.write(0,0,'data')
wb.save('myexcel.xls')book = xlrd.open_workbook('myexcel.xls')
new_book = xlutils.copy(book)
worksheet = new_book.getsheet(0)
worksheet.write(0,0,'new data')
new_book.save()
通常 Excel 是一张二维表格的形式,通过行号和列号来找到每一个单元格,Python 库中对 Excel 的操作也是如此,指定行号和列号就能定位到一个单元格,可以在这里读取或写入数据,甚至设定格式等。
应用场景
应用场景很广泛,主要适合工作中的报表自动化等环节。例如文章开头提到的场景中,你可以将每天要做的 Word 报告,使用 docxtpl 做成模板,各个位置用 {{var}} 设置好占位符。然后每天拿到 Excel 表格,可以使用 xl** 相关包把数据读取出来,然后自动替换到 Word 模板中。开发这套流程需要一点时间,但一旦做成,生成一份报表只要几秒钟。
相关链接
Python 小专栏已经写了好几期了,之前的内容可以点击下面链接回顾:
① 安装配置环境
② Python 自学教程
③ 来自 Google 的机器学习教程
④ 领取 Python 学习视频(推荐)
快来领 Python 精品学习资料
微信收藏,也可以当云笔记来用
这款百度搜索竟然没广告?
手机阅读,不妨试试微信读书
来自 Google 的机器学习教程
来领 PPT 神器 iSlide 一个月会员
各类学习资料合集限时免费