前言
记得我刚学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模板文件
1 条评论
情感浓度过高可适当留白,以达平衡。