一、前提

  上一篇,我写了下载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. Glossary in Turbulence

    Table of Contents 1. Concepts/Glossary 1.1. Turbulent eddy viscosity ,μt 1.2. Turbulent kinetic ener ...

  2. Python基础(九) 内置模块

    今天学习Python中的模块,模块类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函 ...

  3. 48. spring boot单元测试restfull API【从零开始学Spring Boot】

    回顾并详细说明一下在在之前章节中的中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...

  4. 搭建Kafka运行环境-Mac版

    停止kafka服务: kafka_2.12-0.10.2.1> bin/kafka-server-stop.sh kafka_2.12-0.10.2.1> bin/zookeeper-se ...

  5. Python学习笔记 (1)Hello World(环境搭建+输出Hello World!)

    随想 高考发挥失常.科三遇火车发挥失常,各种不顺……突然发现假期都快没了,才想起高考前想象的这个假期要做的一堆事,现在来多完成一件吧. 这几篇博客仅只是我的学习笔记,凑合看吧.我这个python小白看 ...

  6. vim配置说明20170819

    一.修改-/.vim/colors/guodesert.vim " Vim color file " Maintainer: Hans Fugal <hans@fugal.n ...

  7. [bzoj3289]Mato的文件管理_莫队_树状数组

    Mato的文件管理 bzoj-3289 题目大意:给定一个n个数的序列.m次询问:一段区间中的逆序对个数. 注释:$1\le n\,mle 5\cdot 10^4$. 想法: 开始想这个题的大佬们,给 ...

  8. Open Flash Chart2 常用的参数

    http://fyzeng.diandian.com/post/2011-07-29/3339982 {   /* 图表标题 */   "title" : {     " ...

  9. influxDB系列(二)--查看数据库的大小

    google 搜索了好多文档,终于发现了这个靠谱的回答. https://groups.google.com/forum/#!topic/influxdb/I5eady_Ta5Y You can se ...

  10. Codeforces 577E Ann and Half-Palindrome 字典树

    题目链接 题意: 若一个字符串是半回文串.则满足第一位和最后一位相等, 第三位和倒数第三位相等.如此类推. 给定一个字符串s,输出s的全部子串中的半回文串字典序第k大的 字符串. good[i][j] ...