当前位置: 移动技术网 > IT编程>开发语言>JavaScript > Python:数据导出到Excel(使用xlwt)

Python:数据导出到Excel(使用xlwt)

2020年07月30日  | 移动技术网IT编程  | 我要评论

写在前面:前端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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网