美文网首页python
django导出数据生成excel并下载到本地

django导出数据生成excel并下载到本地

作者: LittleJessy | 来源:发表于2018-12-12 15:41 被阅读1146次

    功能分析:
    1、生成excel文件;
    2、将生成的excel文件下载到本地;

    utils.py文件中完成excel文件的数据写入,及生成表格样式设置

    import xlwt,datetime
    from xlwt import *
    # 写入excel文件函数
    def wite_to_excel(n,head_data,records,download_url):
        #获取时间戳
        timestr = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    
        # 工作表
        wbk = xlwt.Workbook()
        sheet1 = wbk.add_sheet('sheet1',cell_overwrite_ok=True)
    
        #写入表头
        for filed in range(0,len(head_data)):
            sheet1.write(0,filed,head_data[filed],excel_head_style())
    
    
        #写入数据记录
        for row in range(1,n+1):
            for col in range(0,len(head_data)):
                sheet1.write(row,col,records[row-1][col],excel_record_style())
                #设置默认单元格宽度
                sheet1.col(col).width = 256*15
    
        wbk.save(download_url+'New-'+timestr+'.xls')
        return timestr
    
    # 定义导出文件表头格式
    def excel_head_style():
        # 创建一个样式
        style = XFStyle()
        #设置背景色
        pattern = Pattern()
        pattern.pattern = Pattern.SOLID_PATTERN
        pattern.pattern_fore_colour = Style.colour_map['light_green']  # 设置单元格背景色
        style.pattern = pattern
        # 设置字体
        font0 = xlwt.Font()
        font0.name = u'微软雅黑'
        font0.bold = True
        font0.colour_index = 0
        font0.height = 240
        style.font = font0
        #设置文字位置
        alignment = xlwt.Alignment()  # 设置字体在单元格的位置
        alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平方向
        alignment.vert = xlwt.Alignment.VERT_CENTER  # 竖直方向
        style.alignment = alignment
        # 设置边框
        borders = xlwt.Borders()  # Create borders
        borders.left = xlwt.Borders.THIN  # 添加边框-虚线边框
        borders.right = xlwt.Borders.THIN  # 添加边框-虚线边框
        borders.top = xlwt.Borders.THIN  # 添加边框-虚线边框
        borders.bottom = xlwt.Borders.THIN  # 添加边框-虚线边框
        style.borders = borders
    
        return style
    
    # 定义导出文件记录格式
    def excel_record_style():
        # 创建一个样式
        style = XFStyle()
        #设置字体
        font0 = xlwt.Font()
        font0.name = u'微软雅黑'
        font0.bold = False
        font0.colour_index = 0
        font0.height = 200
        style.font = font0
        #设置文字位置
        alignment = xlwt.Alignment()  # 设置字体在单元格的位置
        alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平方向
        alignment.vert = xlwt.Alignment.VERT_CENTER  # 竖直方向
        style.alignment = alignment
        # 设置边框
        borders = xlwt.Borders()  # Create borders
        borders.left = xlwt.Borders.THIN  # 添加边框-虚线边框
        borders.right = xlwt.Borders.THIN  # 添加边框-虚线边框
        borders.top = xlwt.Borders.THIN  # 添加边框-虚线边框
        borders.bottom = xlwt.Borders.THIN  # 添加边框-虚线边框
        style.borders = borders
    
        return style
    
    

    views.py文件调用上述函数完成excel文件的生成

    import os,sys
    from public.utils import *
    
    #导出功能实现
    def process_export_excel(request):
        project_codes = request.POST.get("project_code")
        project_codes = project_codes.split(',')
        n = len(project_codes)
    
        #表头字段
        head_data = [u'项目编号',u'项目名称',u'测试阶段',u'测试周期',u'提测日期',u'上线日期',u'研发负责人',u'测试负责人',u'进度',u'进度是否正常',u'影响进度原因',u'冒烟测试是否通过',u'冒烟测试未通过原因',u'备注']
        #查询记录数据
        records = []
        for project_code in project_codes:
            if project_code != "":
                project_obj = Project.objects.get(project_code=project_code)
                project_code = project_obj.project_code
                project_name = project_obj.project_name
                project_developer = project_obj.developer
                project_tester = project_obj.tester
                project_test_days = project_obj.test_days
                project_test_start_date = project_obj.test_start_date
                project_release_date = project_obj.release_date
    
                process_obj = Process.objects.get(project_code=project_code)
                process_stage = process_obj.get_process_stage_display()
                process_percent = process_obj.process_percent
                process_is_percent_nomal = process_obj.get_is_percent_nomal_display()
                process_unnomal_reason = process_obj.unnomal_reason
                is_pass_smoketest = process_obj.get_is_pass_smoketest_display()
                nopass_smoketest_reason = process_obj.nopass_smoketest_reason
    
                daiyRecord_obj = DailyRecord.objects.filter(project_code_id=project_code).values()
                daiyRecord_list = list(daiyRecord_obj)
                problem_record= daiyRecord_list[-1]['problem_record']
    
                record = []
                record.append(project_code)
                record.append(project_name)
                record.append(process_stage)
                record.append(project_test_days)
                record.append(str(project_test_start_date)[0:10])
                record.append(str(project_release_date)[0:10])
                record.append(project_developer)
                record.append(project_tester)
                record.append(process_percent+'%')
                record.append(process_is_percent_nomal)
                record.append(process_unnomal_reason)
                record.append(is_pass_smoketest)
                record.append(nopass_smoketest_reason)
                record.append(problem_record)
    
            records.append(record)
    
        #获取当前路径
        cur_path = os.path.abspath('.')
        #设置生成文件所在路径
        download_url = cur_path+'\\upload\\'
    
        #写入数据到excel中
        ret = wite_to_excel(n,head_data,records,download_url)
    
        return HttpResponse(ret)
    

    下载功能实现

    view.py添加download函数

    def download(request,offset):
    
        from django.http import StreamingHttpResponse
        def file_iterator(file_name,chunk_size=512):
            with open(file_name,'rb') as f:
                while True:
                    c = f.read(chunk_size)
                    if c:
                        yield c
                    else:
                        break
    
        # 显示在弹出对话框中的默认的下载文件名
        the_file_name ='New-'+offset+'.xls'
    
        #获取当前路径
        cur_path = os.path.abspath('.')
        #设置生成文件所在路径
        download_url = cur_path+'\\upload\\'
    
        response = StreamingHttpResponse(file_iterator(download_url+'New-'+offset+'.xls'))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name)
    
        return response
    

    html文件中选择导出数据并下载

            <input id="ipt1" type="text" name="project_code" style="display:none"/>
            <button id="downData" type="onclick" class="layui-btn btn " onclick="downData();">
                <span class="glyphicon glyphicon-share" aria-hidden="true"></span>导出
            </button>
    

    js

            function getCookie(name) {
                var cookieValue = null;
                if (document.cookie && document.cookie != '') {
                    var cookies = document.cookie.split(';');
                    for (var i = 0; i < cookies.length; i++) {
                        var cookie = jQuery.trim(cookies[i]);
    // Does this cookie string begin with the name we want?
                        if (cookie.substring(0, name.length + 1) == (name + '=')) {
                            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                            break;
                        }
                    }
                }
                return cookieValue;
            }
    
            function csrfSafeMethod(method) {
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
            }
    
            //导出
            function downData() {
                var env_codes = new Array();
                var count = 0;
                var i = 0;
                $("#myAlert").css("display", "none");
                $("#myAlert1").css("display", "none");
                $("#myAlert2").css("display", "none");
                $("#table").find(":checkbox:checked").each(function () {
                    env_code = $(this).parent().next().text();
                    //alert(env_code);
                    if (env_code != "") {
                        env_codes[i++] = env_code;
                    }
                    count++;
                });
                if (count == 0) {
                    $("#myAlert2").css("display", "inherit");
                    return false;
                }
                $("#downData").val(env_codes)
                var project_code = $("#downData").val()
                //alert(project_code);
                $.ajax({
                    type: 'POST',
                    url: '/project/process/process_export_excel/',
                    dataType: 'text',
                    data: {'project_code': project_code},
                    beforeSend: function (xhr, settings) {
                        var csrftoken = getCookie('csrftoken');
                        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                            xhr.setRequestHeader("X-CSRFToken", csrftoken);
                        }
                    },
                    success: function (text) {
                        var url = '/project/process/download/' + text;
                        window.location.href = url;
                    },
                    error: function () {
                        alert('导出失败');
                    }
                });
    
            }
    

    urls.py文件路由配置

        url('^/process_export_excel/$', proviews.process_export_excel),
        url('^/download/(\w+)*/$', proviews.download),
    

    相关文章

      网友评论

        本文标题:django导出数据生成excel并下载到本地

        本文链接:https://www.haomeiwen.com/subject/lzfphqtx.html