一、前提

  上一篇,我写了下载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. 每日命令:(3)pwd

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  2. web视频播放插件:Video For Everybody

    相比其它的web视频播放插件(video.js , jwplayer等)来说,Video For Everybody(极力推荐)是一款更好的视频播放插件,无需任何下载,支持html5以及flash播放 ...

  3. Python 开发面试题

    Python部分 将一个字符串逆序,不能使用反转函数 求从10到100中能被3或5整除的数的和 What is Python? What are the benefits of using Pytho ...

  4. Ajax_数据格式_HTML

    [数据格式提要] 1.在服务器端Ajax是一门与语言无关的技术.在业务逻辑层使用何种服务器端语言都可以. 2.从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送.服务器端的编程语言只能 ...

  5. [luoguP3203][HNOI2010]BOUNCE 弹飞绵羊(LCT)

    传送门 每个点都会跳到另一个点,连边就是一棵树. 更改弹力就是换边. 求一个点跳多少次跳到终点就是求这个点的深度,那么只需要维护 size 域,access(n + 1) 然后 splay(x),求 ...

  6. Cx的治疗

    题目背景 「Cx的故事」众所周知,Cx是一个宇宙大犇.由于Cx在空中花园失足摔下,导致他那蕴含着无穷智慧的大脑受到了严重的损伤,许多的脑神经断裂.于是,Cx的wife(有么?)决定请巴比伦最好的医师治 ...

  7. 【Teamviewer】Teamviewer远程访问工具使用方法

    首先电脑必须能访问外网,即使是在局域网内也无所谓. 1.这里以非自动登录.自动受控的方式为例.首先,让对方也安装一个Teamviewer,或运行一个绿色的Teamviewer,并保证网络可通.然后我们 ...

  8. multiple instance of mac app

    一般情况下,mac系统上的应用程序只能启动一个实例,现在做项目,需要mac上同时启动多个实例,如何做呢,下面就说明完成这个功能的方法: 主要原理:利用 open -n Applications/XXX ...

  9. D. Palindromic characteristics

    time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standa ...

  10. 51Nod——T 1631 小鲨鱼在51nod小学

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1631 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 ...