前言

记得我刚学Python的时候,我看了几个教程,好像都喜欢先教你怎么用Python操作Excel文件,说实话刚开始有被惊艳到,但是后来觉得操作起来也挺麻烦就没细学。再之,我在日常中对读取Excel文件进行数据分析的需求比较多,遇到这些问题肯定用的是pandas这个神器,读写Excel/csv文件都是极佳的。但是今天写项目需求的时候,需要往一个模板里面写入数据,这个时候pandas就爱莫能助了,还是得使用xlrdxlwtxlutils三件套来解决战斗。

理清三者关系

xlrdxlwtxlutils是用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代表字体,boldalignborder分别控制是否加粗、居中对齐,所有边框。

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模板文件

Last modification:January 10th, 2021 at 02:10 am