zoukankan      html  css  js  c++  java
  • Python/Django 下载Excel2003

    一、安装

      目前支持Excel2003的第三方库多少还有几个,本文使用的是xlwt,安装方式命令行:pip install xlwt

    二、使用

      首先、引入该库,例如:from xlwt import *

      其次、

        创建Excel文件,如:workbook = Workbook(encoding = 'utf-8')

        创建Excel sheet,如:worksheet = workbook.add_sheet("Summary"),即sheet名称为Summary

        常用方式:

          设置列宽:worksheet.col(0).width = 10000,即设置第一列宽度为10000,Excel文件的行列索引均从0开始

          写数据:worksheet.write(row, column, domain_title[column], style.head), 写入第row+1行,column+1列的单元格数据 domain_title[column],设置的格式style.head

          此处格式的定义如: 

    head = easyxf("""
            font:
                name Arial,
                colour_index white,
                bold on,
                height 0xA0;
            align:
                wrap off,
                vert center,
                horiz center;
            pattern:
                pattern solid,
                fore-colour 0x19;
            borders:
                left THIN,
                right THIN,
                top THIN,
                bottom THIN;
            """)
    body = easyxf("""
            font:
                name Arial,
                bold off,
                height 0XA0;
            align:
                wrap on,
                vert center,
                horiz left;
            borders:
                left THIN,
                right THIN,
                top THIN,
                bottom THIN;
            """)

          以上为一些设置的格式,使用xlwt的类EasyXF创建。

        获取某个sheet, 如:worksheet = workbook.get_sheet("Summary"),则可获取sheet 名称为Summary的sheet

    第三、保存输出

      输出到Response流:

       out = BytesIO()
        workbook.save(out)
        out.seek(0)
        response = HttpResponse(out.getvalue(), content_type = 'application/vnd.ms-excel')
        dt = datetime.datetime.now()
        response['Content-Disposition'] = 'attachment;filename={} {}.xls'.format(urlquote(domain_name), dt.strftime('%Y-%m-%d %H:%M:%S'))
        print("end downloading...")
        return response

      以上,值得一提的是,如果你的Excel文件的名称含有中文,请使用urlquote包装一下,这样下载下来的Excel文件中文名才能正常显示,上面也是因为文件名含有中文才使用的这个函数的;引入的方式:from django.utils.http import urlquote

      至此、下载完成。

    贴下代码:

    # coding: UTF-8
    
    from io import BytesIO
    
    import pandas
    from django.http import HttpResponse, StreamingHttpResponse
    from django.utils import timezone as datetime
    from django.utils.http import urlquote
    from xlwt import *
    
    from automation import style
    from automation.ecarxzip import ZipFile
    from automation.tasks import *
    from web.settings import DOWNLOAD_URL
    
    
    def download_excel(request, task_id, domain_name = '全部'):
        print("start downloading xls...", task_id)
    
        domains = [{'domain_name': domain_name}]
        ai_task = AITask.objects.get(id = task_id)
        if '全部' == domain_name:
            if 1 == ai_task.type:
                domains = Classification.objects.values('domain_name').distinct().filter(type = 1)
            elif 2 == ai_task.type:
                domains = Classification.objects.values('domain_name').distinct().filter(type = 2)
            else:
                pass
    
        summaries = []
        summary_title = ["Domain", "Pass", "Fail"]
        domain_title = ['Domain', 'One level', 'Two level', 'Semantic', 'Priority', 'Intent group', 'Intent', 'Result',
                        'Handle time', 'Response time', 'Server Domain', 'Detail']
    
        workbook = Workbook(encoding = 'utf-8')
        worksheet = workbook.add_sheet("Summary")
        for column in range(len(summary_title)):
            worksheet.write(0, column, summary_title[column], style.head)
    
        for domain in domains:
            dmain_name = domain["domain_name"]
            reports = ai_task.report.filter(semantic__classification__domain_name__exact = dmain_name)
            if len(reports):
                row = pass_no = fail_no = 0
                worksheet = workbook.add_sheet(dmain_name)
                worksheet.col(3).width = worksheet.col(5).width = worksheet.col(6).width = 7000
                worksheet.col(11).width = 10000
                for column in range(len(domain_title)):
                    worksheet.write(row, column, domain_title[column], style.head)
    
                for report in reports:
                    row = row + 1
                    semantic = report.semantic
                    classification = semantic.classification
                    worksheet.write(row, 0, classification.domain_name, style.body)
                    worksheet.write(row, 1, classification.first_classification, style.body)
                    worksheet.write(row, 2, classification.second_classification, style.body)
                    worksheet.write(row, 3, semantic.name, style.body)
                    worksheet.write(row, 4, classification.semantic_property, style.body)
                    worksheet.write(row, 5, classification.intent_group, style.body)
                    worksheet.write(row, 6, classification.intent, style.body)
                    worksheet.write(row, 7, report.result, style.body)
                    worksheet.write(row, 8, report.in_handle_time, style.body)
                    worksheet.write(row, 9, report.ex_handle_time, style.body)
                    worksheet.write(row, 10, report.server_domain, style.body)
                    worksheet.write(row, 11, report.description[:32767], style.large_text)
    
                    if "pass" == report.result:
                        pass_no = pass_no + 1
                    elif "fail" == report.result:
                        fail_no = fail_no + 1
                summaries.append((dmain_name, pass_no, fail_no))
    
        row = 0
        worksheet = workbook.get_sheet("Summary")
        for dmain_name, pass_no, fail_no in summaries:
            row = row + 1
            worksheet.write(row, 0, dmain_name, style.body)
            worksheet.write(row, 1, pass_no, style.body)
            worksheet.write(row, 2, fail_no, style.body)
    
        out = BytesIO()
        workbook.save(out)
        out.seek(0)
        response = HttpResponse(out.getvalue(), content_type = 'application/vnd.ms-excel')
        dt = datetime.datetime.now()
        response['Content-Disposition'] = 'attachment;filename={} {}.xls'.format(urlquote(domain_name), dt.strftime('%Y-%m-%d %H:%M:%S'))
        print("end downloading...")
        return response

          

  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/itachy/p/9224318.html
Copyright © 2011-2022 走看看