一、前提

  上一篇,我写了下载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. PHP代码静态分析工具PHPStan

    最近发现自己写的PHP代码运行结果总跟自己预想的不一样,排查时发现大多是语法错误,在运行之前错误已经种下.可能是自己粗心大意,或者说php -l检测太简单,不过的确是有一些语法错误埋藏得太深(毕竟PH ...

  2. swing中的按钮事件

    package pack2; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax ...

  3. sectional data interpolation in Tecplot

    $!Varset |NumLoop|= $!Loop |NumLoop| $!Varset |num|=(|Loop|*+) $!RotateData ZoneList = [] Angle = |n ...

  4. concepts in Turbulent Flow

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

  5. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  6. Attempting to track I/O with systemtap

    https://glandium.org/blog/?p=1476 Attempting to track I/O with systemtap There are several ways a pr ...

  7. WINDOW 专家

    http://www.cnblogs.com/shanyou/category/725986.html

  8. python_swift_project_middleware

    1. 写openstack swift的middleware 首先要确定swift用的是哪个middleware文件. 比如healthcheck这个中间件,在机器上有很多同名文件如下, 这两行可能是 ...

  9. linux 卸载php mysql apache

    卸载Mysql 1.查找以前是否装有mysql 命令:rpm -qa|grep -i mysql 可以看到mysql的包: mysql-3.23.58-9php-mysql-4.3.4-11mod_a ...

  10. [容斥原理] hdu 1796 How many integers can you find

    题意: 给一个N.然后给M个数,问1~N-1里面有多少个数能被这M个数中一个或多个数整除. 思路: 首先要N-- 然后对于每一个数M 事实上1~N-1内能被其整除的 就是有(N-1)/M[i]个 可是 ...