Python:数据导出到Excel(使用xlwt)
写在前面:前端ajax调用导出方法,ajax无法导出问题
原因:ajax是无法直接导出excel的,因为ajax的返回值只能是字符流,而导出excel是后台往浏览器中写入二进制的字节流
方法一、form表单(推荐)
<a href="javascript:void(0)" onclick="exportExcel()">导出</a>
function exportExcel(){
var form = $("<form>");
form.attr('style', 'display:none');
form.attr('target', '');
form.attr('method', 'post');
form.attr('action', '接口url');
var input1 = $('<input>');
input1.attr('type', 'hidden');
input1.attr('name', '参数');
input1.attr('value', '参数值'); /* JSON.stringify($.serializeObject($('#searchForm'))) */
$('body').append(form);
form.append(input1);
form.submit();
form.remove();
}
方法二、window.location.href()
function() {
window.location.href = "接口url?参数1=xxx&参数2=aaa";
}
方法三、ajax请求把参数缓存在后端返回给前端,前端ajax再次发起一个window.open(url?params=params)即可
$.ajax({
url: '接口url',
type: 'post',
dataType: "json",
contentType : 'application/json',
data : JSON.stringify(this.tableOpts),
success: function(data){
window.open('接口url?params=xxxx');
},
xlwt
库负责将数据导出生成Excel表格文件 ,操作的是xls格式的exce,xlwt
库里面所定义的行和列都是从0
开始计数的
导出的py文件:感谢:https://blog.csdn.net/dl1456074580/article/details/87364999
步骤:
1、首先导入xlwt第3方库
2、创建一个workbook模块,相当于创建一个xlwt文件
3、通过add_sheet创建一个表格
4、使用write函数进行对表完成写的操作
5、把写完的数据导入到Excel中
# 导出表格
def write_excel(filename, tabletitle, bodytitle, datalist,sheetName):
"""
:param filename: 输出的文件名
:param tabletitle: 表标题
:param remark: 备注
:param bodytitle: 表头 格式如: ["名字", "课程名称", "课程编号"]
:param datalist: 表格数据 格式二维数组如:
[
["学号1234", "张三", "语文", "course001"],
["学号1235", "李四", "语文", "course001"],
["学号1236", "王五", "语文", "course001"]
]
:return:
"""
# 设置字体
font = xlwt.Font()
font.bold = True # 加粗
font.name = "微软雅黑"
"""
# May be: NO_LINE = 无线, THIN = 实线, MEDIUM = 中, DASHED = 虚线, DOTTED = 点虚线, THICK = 厚,
DOUBLE, HAIR, MEDIUM_DASHED,
THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED, MEDIUM_DASH_DOT_DOTTED,
SLANTED_MEDIUM_DASH_DOTTED
"""
# 设置边框
borders = xlwt.Borders()
borders.left = xlwt.Borders.THIN
borders.right = xlwt.Borders.THIN
borders.top = xlwt.Borders.THIN
borders.bottom = xlwt.Borders.THIN
# 设置居中(左右上下居中)
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平方向
alignment.vert = xlwt.Alignment.HORZ_CENTER # 垂直方向
"""
0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow,
6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown),
20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray
"""
# 设置背景颜色
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 7 # 背景颜色
# 定义不同的excel style
style_tabletitle = xlwt.XFStyle()
style_tabletitle.font = font
style_tabletitle.borders = borders
style_tabletitle.alignment = alignment
style2 = xlwt.XFStyle()
style2.borders = borders
style2.alignment = alignment
style_data = xlwt.XFStyle()
style_data.alignment = alignment
style_body_title = xlwt.XFStyle()
style_body_title.borders = borders
style_body_title.font = font
style_body_title.pattern = pattern
style_body_title.alignment = alignment
wb = xlwt.Workbook(encoding='utf-8')
worksheet = wb.add_sheet(sheetName)
# 合并单元格并设置样式
worksheet.row(0).height_mismatch = True
worksheet.row(0).height = 20 * 25
# 合并单元格并设置样式
worksheet.write_merge(0, 0, 0, len(bodytitle), tabletitle, style=style_tabletitle)
# worksheet.write_merge(1, 1, 0, len(bodytitle), remark)
# 确定栏位宽度
col_width = []
for i in range(len(datalist)):
for j in range(len(datalist[i])):
if i == 0:
col_width.append(len_byte(datalist[i][j]))
else:
if len(col_width) <= j:
col_width.append(len_byte(datalist[i][j]))
else:
if col_width[j] < len_byte(str(datalist[i][j])):
col_width[j] = len_byte(datalist[i][j])
# 设置栏位宽度,栏位宽度小于10时候采用默认宽度
for i in range(len(col_width)):
if col_width[i] > 10:
worksheet.col(i).width = 256 * (col_width[i] + 1)
# 设置栏位高度
# tall_style = xlwt.easyxf('font:height 720;') #设置字体高度
# row0 = worksheet.row(0)
# row0.set_style(tall_style)
for i in range(0, len(bodytitle)):
worksheet.write(1, i, bodytitle[i], style=style_body_title)
# excel内容写入
for i in range(len(datalist)):
for j in range(len(datalist[i])):
worksheet.write(i + 2, j, datalist[i][j],style=style_data)
sio = BytesIO()
# 将excel文件保存到字节流里面
wb.save(sio)
sio.seek(0)
# # 设置响应参数
# filename = "表格.xls"
response = HttpResponse(sio.getvalue(), content_type='application/vnd.ms-excel; charset=UTF-8')
basename = os.path.basename(filename)
utf_filename = quote(basename.encode("utf-8"))
response["Content-Disposition"] = "attachment;filename*=utf-8''{}".format(utf_filename)
response.write(sio.getvalue())
return response
# 获取字符串长度,一个中文的长度为2
def len_byte(value):
if value is None or value == "":
return 10
if type(value) != int:
length = len(value)
utf8_length = len(value.encode('utf-8'))
length = (utf8_length - length) / 2 + length
else:
length = len(str(value))
return int(length)
调用:
"""
导出班级学生信息
"""
def export_class_stu(request):
arguments = _getArguments(request)
try:
class_id = arguments.get("class_id", "")
data = []
return_data = []
state = 202
msg = ""
if class_id and class_id != "":
stu_learn_info = StudentLearningInfo.objects.filter(class_field_id=class_id)
length = len(stu_learn_info)
className = ""
if stu_learn_info and length > 0:
for i in range(length):
stu_learn = stu_learn_info[i]
data.append(model_to_dict(stu_learn))
stu_info = Student.objects.get(pk=stu_learn.student.student_id)
data[i]["student"] = stu_info.name
data[i]["course"] = stu_learn.course.course_name
className = stu_learn.class_field.class_name
data[i]["class_field"] = className
data[i]["phone"] = stu_info.phone_number
phoneID = stu_info.phone_id
data[i]["phone_id"] = phoneID
data[i]["cdk_unlock"] = ""
if phoneID and phoneID != "":
phone_view = PhoneCdkView()
phone_info = phone_view._selectOneCdkByPhoneId(phoneID)
if phone_info:
data[i]["cdk_unlock"] = phone_info["cdk_unlock"][0:6]
else:
data[i]["cdk_unlock"] = "phoneID可能错,请联系管理员查看"
data[i]["weChat_id"] = stu_info.wechat_id
for data_list in data:
list_info = list(data_list.values())
list_info.pop(0)
return_data.append(list_info)
print(return_data[0])
fileName = className+"学生学习信息表"+str(datetime.datetime.now().strftime("%Y-%m-%d"))+"-"+str(str(datetime.datetime.now().timestamp()).split(".")[0]) + ".xls"
tabletitle = className+"学生学习信息表"
bodytitle = ["姓名", "课程名", "钉钉用户ID", "班级", "培训学习数", "培训学习完成数", "必修培训完成数", "必修培训按时完成数", "必修培训逾期完成数", "视频学习数", "学习总时长", "学习时长(单位换算成秒)", "完成率", "联系电话", "手机ID", "解锁码", "微信ID"]
response = write_excel(fileName, tabletitle, bodytitle, return_data, className)
state = 200
msg = className + "学生学习数据导出成功"
return response
else:
state = 202
msg = "没有该班学生学习信息"
else:
state = 202
msg = "请选择想要导出的班级信息"
return_dict = {
'data': return_data,
'state': state,
'msg': msg
}
return JsonResponse(return_dict, json_dumps_params={'ensure_ascii': False})
except Exception as e:
traceback.print_exc()
return JsonResponse({"state": 500, "msg": "系统出错,请联系管理员", "errMsg": str(e)},
json_dumps_params={'ensure_ascii': False})
结果:
简单版:
# coding:utf-8
import xlwt
# excel路径
excle_path = r'E:\1234.xls'
# 创建一个Workbook模块
data = xlwt.Workbook(encoding='utf-8')
# 创建一个表格,cell_overwrite_ok=True 为不覆盖表,默认为False
sheet = data.add_sheet('test123',cell_overwrite_ok=True)
# 写入坐标为(0,0)内容为职位
sheet.write(0,0,'职位')
# 写入坐标为(1,0)内容为软件测试工程师
sheet.write(1,0,'软件测试工程师')
# 保存到excel中
data.save(excle_path)
设置单元格的一些参数:
感谢:https://www.cnblogs.com/xiaodingdong/p/8012282.html
https://www.jianshu.com/p/bdd06c6f23a7
font:主要对字体进行操作,比如字体的颜色、大小 alignment:主要是对输入内容之后的对齐方式对齐 borders:每一个单元格的格式 pattern:设置单元格的背景颜色
1、font
font.bold = bold # 粗体
font.italic = True # 斜体
font.underline = 10 # 下划线(其中当值为9,整行的填充色为蓝色)
font.struck_out =True # 横线(比如:在一个字中 画上一横)
def setStyle(name, height,color, bold=False):
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
# 字体类型:比如宋体、仿宋也可以是汉仪瘦金书繁
font.name = name
# 设置字体颜色
font.colour_index = color
# 字体大小
font.height = height
# 定义格式
style.font = font
return style
if __name__ == '__main__':
# 创建工作簿,并指定写入的格式
f = xlwt.Workbook(encoding='utf8') # 创建工作簿
# 创建sheet,并指定可以重复写入数据的情况.设置行高度
sheet1 = f.add_sheet(u'colour', cell_overwrite_ok=False)
# 控制行的位置
column = 0;
row = 0
# 生成第一行
for i in range(0, 100):
# 参数对应:行,列,值,字体样式(可以没有)
sheet1.write(column, row, i, setStyle('Times New Roman', 400, i, False))
# 这里主要为了控制输入每行十个内容。为了查看
row = row + 1
if row % 10 ==0:
column = column + 1
row = 0
f.save(r'E:\xlwtExCEL.xls') # 保存文档
效果图:其中1和9看不清,可能写入的颜色为白色,并不是没有写入。
二.borders中设置元素边框的属性:
def setStyle(name, height,color, bold=False):
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
# 字体类型:比如宋体、仿宋也可以是汉仪瘦金书繁
font.name = name
# 设置字体颜色
font.colour_index = color
# 字体大小
font.height = height
# 定义格式
style.font = font
# borders.left = xlwt.Borders.THIN
# NO_LINE: 官方代码中NO_LINE所表示的值为0,没有边框
# THIN: 官方代码中THIN所表示的值为1,边框为实线
borders = xlwt.Borders()
borders.left = color
borders.left = xlwt.Borders.THIN
borders.right = color
borders.top = color
borders.bottom = color
# 定义格式
style.borders = borders
return style
if __name__ == '__main__':
# 创建工作簿,并指定写入的格式
f = xlwt.Workbook(encoding='utf8') # 创建工作簿
# 创建sheet,并指定可以重复写入数据的情况.设置行高度
sheet1 = f.add_sheet(u'colour', cell_overwrite_ok=False)
# 控制行的位置
column = 0
row = 0
# 生成第一行
for i in range(0, 100):
# 参数对应:行,列,值,字体样式(可以没有)
sheet1.write(column, row, i, setStyle('汉仪瘦金书繁', 400, i, True))
# 这里主要为了控制输入每行十个内容。为了查看
row = row + 1
if row % 10 == 0:
column = column + 1
row = 0
f.save(r'E:\xlwtExCEL.xls') # 保存文档
三、pattern设置单元格的颜色背景颜色:
def setStyle(name, height,color, bold=False):
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
# 字体类型:比如宋体、仿宋也可以是汉仪瘦金书繁
font.name = name
# 设置字体颜色
font.colour_index = color
# 字体大小
font.height = height
# 定义格式
style.font = font
# borders.left = xlwt.Borders.THIN
# NO_LINE: 官方代码中NO_LINE所表示的值为0,没有边框
# THIN: 官方代码中THIN所表示的值为1,边框为实线
borders = xlwt.Borders()
borders.left = color
borders.left = xlwt.Borders.THIN
borders.right = color
borders.top = color
borders.bottom = color
# 定义格式
style.borders = borders
# 设置背景颜色
pattern = xlwt.Pattern()
# 设置背景颜色的模式
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# 背景颜色
pattern.pattern_fore_colour = color
style.pattern = pattern
return style
if __name__ == '__main__':
# 创建工作簿,并指定写入的格式
f = xlwt.Workbook(encoding='utf8') # 创建工作簿
# 创建sheet,并指定可以重复写入数据的情况.设置行高度
sheet1 = f.add_sheet(u'colour', cell_overwrite_ok=False)
# 控制行的位置
column = 0
row = 0
# 生成第一行
for i in range(0, 100):
# 参数对应:行,列,值,字体样式(可以没有)
sheet1.write(column, row, i, setStyle('汉仪瘦金书繁', 400, i, True))
# 这里主要为了控制输入每行十个内容。为了查看
row = row + 1
if row % 10 == 0:
column = column + 1
row = 0
f.save(r'E:\xlwtExCEL.xls') # 保存文档
四、alignment对齐方式的设置:
def setStyle(name, height,color, bold=False):
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
# 字体类型:比如宋体、仿宋也可以是汉仪瘦金书繁
font.name = name
# 设置字体颜色
font.colour_index = color
# 字体大小
font.height = height
# 定义格式
style.font = font
alignment = xlwt.Alignment()
alignment.horz = color
# 设置居中(左右上下居中)
# alignment = xlwt.Alignment()
# alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平方向
# alignment.vert = xlwt.Alignment.HORZ_CENTER # 垂直方向
style.alignment = alignment
return style
if __name__ == '__main__':
# 创建工作簿,并指定写入的格式
f = xlwt.Workbook(encoding='utf8') # 创建工作簿
# 创建sheet,并指定可以重复写入数据的情况.设置行高度
sheet1 = f.add_sheet(u'colour', cell_overwrite_ok=False)
# 控制行的位置
column = 0
row = 0
# 生成第一行
for i in range(0, 100):
# 参数对应:行,列,值,字体样式(可以没有)
sheet1.write(column, row, i, setStyle('汉仪瘦金书繁', 400, i, True))
# 这里主要为了控制输入每行十个内容。为了查看
row = row + 1
if row % 10 == 0:
column = column + 1
row = 0
f.save(r'E:\xlwtExCEL.xls') # 保存文档
本文地址:https://blog.csdn.net/weixin_38676276/article/details/107645403
上一篇: 04 元组(源于Datawhale)
下一篇: Python装饰器基础详解