xlwt 创建表格

151 阅读1分钟

通过xlwt创建表格,以及按照需求对表格样式进行调整

1.创建表格对象以及样式对象

def create_excel_sheet_style(sheet_name):
    sheet_name = sheet_name
    xl = xlwt.Workbook(encoding="utf-8")
    sheet = xl.add_sheet(sheet_name, cell_overwrite_ok=True)

    # 字体
    font = xlwt.Font()
    font.name = '宋体'
    font.height = 20 * 12

    # 表格边框
    borders = xlwt.Borders()
    borders.left = 1
    borders.right = 1
    borders.top = 1
    borders.bottom = 1
    borders.bottom_colour = 0x3A

    # 居中格式
    alignment = xlwt.Alignment()
    alignment.horz = xlwt.Alignment.HORZ_CENTER
    alignment.vert = xlwt.Alignment.VERT_CENTER

    # 背景色
    pattern = xlwt.Pattern()
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = 22

    # 表头样式
    style_h = xlwt.XFStyle()
    style_h.font = font
    style_h.alignment = alignment
    style_h.pattern = pattern

    # 内容样式
    style_t = xlwt.XFStyle()
    style_t.font = font
    style_t.borders = borders
    style_t.alignment = alignment

    return xl, sheet, style_h, style_t
    
    
    # 为方便使用,此函数创建了两个样式对象,用于后续表头样式和内容样式的使用

2.表格数据添加

def details_resp(sheet_name, header_row, data, file_name):
    # 创建表头和样式对象
    xl, sheet, style_h, style_t = cls.create_excel_sheet_style(sheet_name)

    # 设置所有列宽(该表格固定列数及列宽,有需要可自己调整)
    for itm in range(7):
        if itm == 6:
            sheet.col(itm).width = 24000  # 可优化为根据内容宽度自适应列宽
            continue
        sheet.col(itm).width = 7000
        
    # 添加表头
    tab_title_column = 0
    sheet.row(0).set_style(xlwt.easyxf('font: height 500'))  # 设置行高
    for value in header_row:
        sheet.write(0, tab_title_column, value, style_h)
        tab_title_column += 1

    # 添加数据
    row = 1
    for itm in data:
        column = 0
        sheet.row(row).set_style(xlwt.easyxf('font: height 500'))
        
        # 合并单元格
        sheet.write_merge(row, row - 1 + len(itm["cls"]), 0, 0, itm["gradeName"], style_t)
        sheet.write_merge(row, row - 1 + len(itm["cls"]), 1, 1, itm["count"], style_t)
        sheet.write_merge(row, row - 1 + len(itm["cls"]), 2, 2, itm["rate"], style_t)
        # 班级数据
        for c in itm["cls"]:
            sheet.row(row).set_style(xlwt.easyxf('font: height 500'))
            sheet.write(row, column + 3, c["clsName"], style_t)
            sheet.write(row, column + 4, c["count"], style_t)
            sheet.write(row, column + 5, c["rate"], style_t)
            sheet.write(row, column + 6, " ".join(["{}{}次".format(k, v) for k, v in c["giftType"].items()]), style_t)
            row += 1
    resp = cls.file_response(xl, file_name)  # 可保存为文件或返回文件流
    return resp

3.文件流

def file_response(xl, file_name):
    sio = io.BytesIO()
    xl.save(sio)
    resp = make_response(sio.getvalue())
    sio.close()
    fn = quote(file_name)
    resp.headers["Content-Disposition"] = "attachment; filename={file_name}; filename*=UTF-8".format(file_name=fn)
    resp.headers[
        'Content-Type'] = 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    resp.headers["filename"] = fn
    return resp

4.效果图

image.png