一、前提

  上一篇,我写了下载Excel2003的博文,这里写下载Excel2007的博文的原因有三:

    第一、Excel2003基本已经淘汰了

    第二、Excel2003下载文件太大,不利于网络传输

    第三、xlwt这个库有个Bug,就是它不支持单元格字符串长度超过32767【这里,有兴趣的同学可以查看下源码】

  好了,废话不多说了,我们进入正题。

二、安装

  本文使用的是pandas,引入库的方式:pip install pandas

三、使用

  首先、引入该库,例如:import pandas

  其次、

    创建Excel文档:

      out = BytesIO()  创建的输出流

      excel = pandas.ExcelWriter(out, engine = 'xlsxwriter')  这里使用xlsxwriter引擎创建, 创建的文件直接关联到输出流out,安装xlsxwriter也很简单,如: pip install xlsxwriter

    创建Sheet:

      summary_df = pandas.DataFrame({})  这里使用空对象创建,下面代码生成的sheet会是一个空sheet

      summary_df.to_excel(excel, sheet_name = "Summary", index = False, header = False)  这里会在excel中创建一个sheet名称为Summary的文档,index=False,使得Excel不会咋第一列创建序号列,xlsxwriter默认会在第一列创建序号列。这里的参数具体用法请参考相关文档。

    获取sheet:worksheet = excel.sheets["Summary"]  获取sheet名称为summary的sheet名

    设置列宽:worksheet.set_column('D:D', 18, long_text_format)  设置第四列宽度为18,使用样式long_text_format【这个样式需要自己提前定义】

    保存Excel:excel.save()

      Excel文件会直接输出上面创建的输出流out。

第四、输出

   

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

贴下源码:

def download_report(request, task_id, domain_name = '全部'):
print("start downloading xlsx...", task_id)
print("start downloading...", domain_name) 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).order_by("domain_name")
elif 2 == ai_task.type:
domains = Classification.objects.values('domain_name').distinct().filter(type = 2).order_by("domain_name") out = BytesIO()
excel = pandas.ExcelWriter(out, engine = 'xlsxwriter') summary_title = ['Domain', 'Pass', 'Fail']
summary_dict = {title: [] for title in summary_title}
domain_title = ['Domain', 'One level', 'Two level', 'Semantic', 'Priority', 'Intent group', 'Intent', 'Result',
'Handle time', 'Response time', 'Server Domain', 'Detail'] summary_df = pandas.DataFrame({})
summary_df.to_excel(excel, sheet_name = "Summary", index = False, header = False) workbook = excel.book
body_format = workbook.add_format(style.body_style)
header_format = workbook.add_format(style.head_style)
long_text_format = workbook.add_format(style.long_text_style)
large_text_format = workbook.add_format(style.large_text_style) sheet_data = {}
for domain in domains:
dmain_name = domain["domain_name"]
sheet_data[dmain_name] = {column_name: [] for column_name in domain_title}
reports = ai_task.report.filter(semantic__classification__domain_name__exact = dmain_name) if len(reports):
pass_no = fail_no = 0
for report in reports:
semantic = report.semantic
classification = semantic.classification sheet_data[dmain_name][domain_title[0]].append(classification.domain_name)
sheet_data[dmain_name][domain_title[1]].append(classification.first_classification)
sheet_data[dmain_name][domain_title[2]].append(classification.second_classification)
sheet_data[dmain_name][domain_title[3]].append(semantic.name)
sheet_data[dmain_name][domain_title[4]].append(classification.semantic_property)
sheet_data[dmain_name][domain_title[5]].append(classification.intent_group)
sheet_data[dmain_name][domain_title[6]].append(classification.intent)
sheet_data[dmain_name][domain_title[7]].append(report.result)
sheet_data[dmain_name][domain_title[8]].append(report.in_handle_time)
sheet_data[dmain_name][domain_title[9]].append(report.ex_handle_time)
sheet_data[dmain_name][domain_title[10]].append(report.server_domain)
sheet_data[dmain_name][domain_title[11]].append(report.description) if "pass" == report.result:
pass_no += 1
elif "fail" == report.result:
fail_no += 1
sheet_df = pandas.DataFrame(sheet_data[dmain_name])
sheet_df.to_excel(excel, sheet_name = dmain_name, index = False, header = False, startrow = 1) worksheet = excel.sheets[dmain_name]
worksheet.set_column('A:C', None, body_format)
worksheet.set_column('D:D', 18, long_text_format)
worksheet.set_column('E:E', None, body_format)
worksheet.set_column('F:G', 30, long_text_format)
worksheet.set_column('H:H', None, body_format)
worksheet.set_column('I:K', None, body_format)
worksheet.set_column('L:L', 50, large_text_format) for col, title in enumerate(sheet_df.columns.values):
worksheet.write(0, col, title, header_format) sheet_data.clear() #回收内存 summary_dict[summary_title[0]].append(dmain_name)
summary_dict[summary_title[1]].append(pass_no)
summary_dict[summary_title[2]].append(fail_no) summary_df = pandas.DataFrame(summary_dict)
summary_df.to_excel(excel, sheet_name = 'Summary', index = False, header = False, startrow = 1)
worksheet = excel.sheets['Summary']
for col, title in enumerate(summary_df.columns.values):
worksheet.write(0, col, title, header_format)
for row in range(len(summary_dict[title])):
worksheet.write(row + 1, col, summary_dict[title][row], body_format)
excel.save() response = HttpResponse(out.getvalue(), content_type = 'application/vnd.ms-excel')
dt = datetime.datetime.now()
response['Content-Disposition'] = 'attachment;filename={} {}.xlsx'.format(urlquote(domain_name), dt.strftime('%Y-%m-%d %H-%M-%S'))
print("End downloading...")
return response

  

     

    

Python/Django 下载Excel2007的更多相关文章

  1. Python/Django 下载Excel2003

    一.安装 目前支持Excel2003的第三方库多少还有几个,本文使用的是xlwt,安装方式命令行:pip install xlwt 二.使用 首先.引入该库,例如:from xlwt import * ...

  2. 搭建Python+Django开发环境

    第一步:安装python. 常见的windows系统,直接python网站下载 最新的版本python3.5. python安装好之后,配置好环境变量.使得python和 pip命令能够正常使用. 第 ...

  3. python Django教程 之 安装、基本命令、视图与网站

    python  Django教程  之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...

  4. Python.Django视频教程(全13集)

    Python.Django视频教程(全13集)教程目录: 下载地址:http://www.fu83.cn/thread-205-1-1.html

  5. Python+Django+Eclipse 在Windows下快速开发自己的网站

    一.配置开发环境 我的开发环境是:Python3.3.2 + Django1.5.2 + Eclipse 1.安装Python 下载地址:http://www.python.org/getit/ 安装 ...

  6. python Django 学习笔记(一)—— Django安装

    注:本人python版本2.7.5 ,win7系统 安装Django https://www.djangoproject.com/download/ 官方下载Django-1.5.5.tar.gz 1 ...

  7. 教你如何将 Sublime 3 打造成 Python/Django IDE开发利器

    Sublime Text 是一款非常强大的文本编辑器, 下面我们介绍如何将 Sublime Text 3 打造成一款 Python/Django 开发利器: 1. 安装 Sublime Text 3 ...

  8. 将 Sublime 3 打造成 Python/Django IDE

    Sublime Text 是一款非常强大的文本编辑器, 下面我们介绍如何将 Sublime Text 3 打造成一款 Python/Django 开发利器: 1. 安装 Sublime Text 3 ...

  9. Python+django开发环境搭建

    Python目前主版本有2个,2.7+和3.4+ 新入手,决定还是从2.7开始 先从python官网https://www.python.org/下载python2.7.10,64位版本(这里注意,选 ...

随机推荐

  1. Springboot2.0中jpa默认创建的mysql表为myisam引擎问题

    使用Springboot2.0后,使用jpa操作mysql数据库时,默认创建的表的引擎是myisam,myisam是不能加外键的,找了一些资源,最终可以用此方法解决! yml格式: spring: j ...

  2. 登录deepin 15.9后不显示任务栏,无法操作

    一直觉得在Linux下编程很酷,所以决定装个Deepin试试,安装很顺利,然后搭建了开发环境,写了一个简单程序,觉得挺不错的. 哪知第二天一开机,登录后找不到任务栏了,做不了啥操作,走接傻眼了,直觉以 ...

  3. 微信小程序中如何实现分页下拉加载?(附源码)

    转眼间坚持写教你微信小程序系列已经有十节系列课程了,每天的工作压力繁重,小女子也不知道自己还能坚持这样的系列教程多久.只希望每篇教程真的对大家有帮助.这节课我们要介绍的就是如何实现分页的下拉加载,我们 ...

  4. Python学习——filter&map

    filter&map 1.filter函数 filter()函数用于过滤序列,过滤掉不符合条件的元素,Python3以后返回一个迭代器对象(可以用list()转化为列表查看). filter( ...

  5. 第十节:Web爬虫之数据存储与MySQL8.0数据库安装和数据插入

    用解析器解析出数据之后,接下来就是存储数据了,保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如 TXT.JSON.csv 另外,还可以保存到数据库中,如关系型数据库MySQL ,非关系型数 ...

  6. BZOJ 1827 洛谷 2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gather

    [题解] 很容易想到暴力做法,枚举每个点,然后对于每个点O(N)遍历整棵树计算答案.这样整个效率是O(N^2)的,显然不行. 我们考虑如果已知当前某个点的答案,如何快速计算它的儿子的答案. 显然选择它 ...

  7. 浅谈对java-GC的理解

    前段时间,一个线上项目忽然很卡,通过监控,发现内存很高,果不其然在几个小时后,OOM.虽说有人很快处理好了.但我还是想站在我的角度,对这件事发表一下自己的观点. 内存溢出,多发生在项目上线后,而且在系 ...

  8. Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)--------hadoop环境的搭建

    Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)------https://blog.csdn.net/pucao_cug/article/details/71698903 ...

  9. Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes

                                                        D. Prefixes and Suffixes You have a string s = s ...

  10. rest frame work纪念版代码

    models.py from django.db import models from pygments.lexers import get_all_lexers from pygments.styl ...