参考:https://blog.csdn.net/weixin_39531594/article/details/114408242
https://blog.csdn.net/weixin_41279955/article/details/101072872
主要代码如下:
from flask import request, Response
import xlwt
def set_style(name, height, horz=0x01, bold=False, background=False):
# 初始化样式
style = xlwt.XFStyle()
# 为样式创建字体
font = xlwt.Font()
font.name = name
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
# 0x01(左端对齐)、0x02(水平方向上居中对齐)、0x03(右端对齐)
style.alignment.horz = horz
# 0x00(上端对齐)、 0x01(垂直方向上居中对齐)、0x02(底端对齐)
style.alignment.vert = 0x01
if background:
style.pattern.pattern = xlwt.Pattern.SOLID_PATTERN
style.pattern.pattern_fore_colour = xlwt.Style.colour_map['pale_blue']
# 细实线:1,小粗实线:2,细虚线:3,中细虚线:4,大粗实线:5,双线:6,细点虚线:7
style.borders.top = 1
style.borders.right = 1
style.borders.bottom = 1
style.borders.left = 1
return style
def export_excel(request_data):
# 导出Excel
result = get_data(request_data)
data = result.get('items', None)
f = xlwt.Workbook(encoding='gbk')
sheet1 = f.add_sheet('信息', cell_overwrite_ok=True)
row0 = ["A", "B", "C", "D", "E", "F", "G"]
start_row = 0
end_row = 1
# 写标题
header_style = set_style('宋体', 240, 0x02, True, True)
for i in range(0, len(row0)):
# sheet1.write(行,列,值,格式)
# 合并行单元格sheet1.write_merge(行1,行2,列1,列2)从行1-行2,列1到列2)
sheet1.write_merge(start_row, end_row, i, i, row0[i], header_style)
sheet1.col(i).width = 4000
sheet1.col(4).width = 9000
row1 = ["H1", "H2", "H3", "H4"]
row0_len = len(row0)
sheet1.write_merge(start_row, start_row, row0_len, row0_len + len(row1) - 1, "H", header_style)
for i in range(0, len(row1)):
# sheet1.write(行,列,值,格式)
sheet1.write(1, i + row0_len, row1[i], header_style)
sheet1.col(i + row0_len).width = 4000
# 写数据列
row_num = 2
data_style = set_style('宋体', 220)
fields = ["A", "B", "C", "D", "E", "F", "G", "H1",
"H2", "H3", "H4"]
if data:
for item in data:
for i in range(0, len(fields)):
sheet1.write(row_num, i, item[fields[i]], data_style)
row_num = row_num + 1
# 文件流的形式保存到内存
stream = io.BytesIO()
try:
f.save(stream)
stream.seek(0)
return stream.getvalue()
finally:
stream.close()
@app.route('/export_excel', methods=['POST'])
def api_export_excel():
"""
:return:
"""
try:
request_data = request.json
stream = export_excel(request_data)
response = Response(stream, content_type='application/octet-stream')
# # xlwt不支持xlsx,只支持xls
response.headers['Content-disposition'] = 'attachment; filename=export_excel.xls'
return response
except Exception as e:
return ApiResult.result_error(e)