前言
记得我刚学Python的时候,我看了几个教程,好像都喜欢先教你怎么用Python操作Excel文件,说实话刚开始有被惊艳到,但是后来觉得操作起来也挺麻烦就没细学。再之,我在日常中对读取Excel文件进行数据分析的需求比较多,遇到这些问题肯定用的是pandas
这个神器,读写Excel/csv文件都是极佳的。但是今天写项目需求的时候,需要往一个模板里面写入数据,这个时候pandas
就爱莫能助了,还是得使用xlrd
、xlwt
、xlutils
三件套来解决战斗。
理清三者关系
xlrd
、xlwt
、xlutils
是用Python处理Excel文档(*.xls)的高效率工具。
其中xlrd
只能用于读取xls文件,xlwt
只能新建xls文件。等等,我上面的需求不是说要实现读取模板文件并且进行填写吗,xlutils
就起到了一个纽带的作用,xlutils
能够将xlrd.Book
转为xlwt.Workbook
,从而可以在现有xls文件的基础上进行修改。
示例代码如下。
import xlrd,xlwt
from xlutils.copy import copy
rd = xlrd.open_workbook("files/template.xls",formatting_info=True) # 打开文件
workbook = copy(rd) # 复制
worksheet = workbook.get_sheet(0) # 获取第一个sheet
值得注意的是使用xlutils.copy
方法得到的xlwt
对象获取sheet的函数是get_sheet(index)
,跟原生的xlwt
打开文件后获取sheet表不太一样。
如何设置字体、居中、大小、边框等等
def setStyle(name, height, color, bold=False, align=True, border=False):
"""
xlwt字体写入设置
"""
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
# 字体类型:比如宋体、仿宋也可以是汉仪瘦金书繁
font.name = name
# 设置字体颜色
font.colour_index = color
# 字体大小
font.height = height
# 字体加粗
font.bold = bold
# 定义格式
style.font = font
if border:
# 框线
borders = xlwt.Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
style.borders = borders
if align:
# 设置单元格对齐方式
al = xlwt.Alignment()
# 0x01(左端对齐)、0x02(水平方向上居中对齐)、0x03(右端对齐)
al.horz = 0x02
# 0x00(上端对齐)、 0x01(垂直方向上居中对齐)、0x02(底端对齐)
al.vert = 0x01
style.alignment = al
return style
写入某个单元格
style = setStyle(name='宋体',height=240,color=256,bold=False,align=False,border=False)
worksheet.write(1,1,'text',style)
这里的height
代表字号大小,换算公式为$height = \text{word字号}\times20$
name
代表字体,bold
、align
、border
分别控制是否加粗、居中对齐,所有边框。
write()
函数前两个参数为写入单元格的位置,值得注意的是第二个数值参数是从0开始的。
写入合并的单元格
worksheet.write_merge(1, 1, 5, 6, '审核证明人:', style)
其中前两个参数代表合并的函数,两个都为1即代表不跨行,写入到第一行,后面的5和6代表第6列和第7列进行了合并,再后面传入的分别是文本和字体风格。
附如何在Django里提供xls文件下载
def export_xls(request)
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=DEMO.xls'
rd = xlrd.open_workbook(
"files/template.xls",
formatting_info=True) # 打开文件
workbook = copy(rd) # 复制
workbook.save(response)
return response
这里的template.xls
即你的Excel模板文件