Python: Export data to Excel (using xlwt)

Written in front: the front-end ajax calls the export method, ajax cannot export the problem

Reason: Ajax cannot directly export excel, because the return value of ajax can only be a character stream, and exporting excel is a binary byte stream written to the browser in the background

Method 1: form (recommended)

<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();   
}

Method two, window.location.href()

function() {
    window.location.href = "接口url?参数1=xxx&参数2=aaa";
}

Method 3: The ajax request caches the parameters in the back end and returns it to the front end, and the front end ajax initiates a window.open(url?params=params) again. 

$.ajax({
url: '接口url',
type: 'post',
dataType: "json",
contentType : 'application/json',
data : JSON.stringify(this.tableOpts),
success: function(data){
    window.open('接口url?params=xxxx');
},

 

xlwtThe library is responsible for exporting the data to generate an Excel table file, and the operation is the exce in xls format. xlwtThe rows and columns defined in the library are 0counted from the beginning

Exported py file: Thanks: https://blog.csdn.net/dl1456074580/article/details/87364999

step:

1. First import the xlwt third party library

2. Create a workbook module, which is equivalent to creating an xlwt file

3. Create a table through add_sheet

4. Use the write function to complete the write operation to the table

5. Import the written data into 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)

transfer:

"""
导出班级学生信息
"""
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})

 result:

Simple version:

# 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)

 

 

 

 

Set some parameters of the cell:

Thanks: 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')  # 保存文档

Effect picture: Among them, 1 and 9 are not clear, and the color that may be written is white, not that it is not written. 

 

2. Set the attributes of the element border in 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')  # 保存文档

 

Three, pattern sets the color background color of the cell: 

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')  # 保存文档

 

 

Fourth, the alignment setting:

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')  # 保存文档

 

Guess you like

Origin blog.csdn.net/weixin_38676276/article/details/107645403