一、前提

  项目上需求的变更总是时时发生的,应对需求的我们,也只能变更我们代码,所以、继前两篇之后,我们的批量下载诞生了

二、安装

  本文使用zipstream库进行压缩,安装方式:pip install zipstream

  生成Excel方式与前一篇博文一致,这里只是为了讲解下批量下载,需要将多个Excel文件保存,并压缩至一个ZIP文件中即可,所以、关于如何生成Excel文件,本文不再额外介绍,请参考下面的的源码,自行学习。

三、使用

  zipstream使用比较简单,这里直接贴出代码:

  

# coding: UTF-8
import os
import zipstream from web.settings import DOWNLOAD_URL class ZipFile: def __init__(self):
self.folder = DOWNLOAD_URL
for filename in os.listdir(self.folder):
file = self.folder + os.sep + filename
if os.path.exists(file):
os.remove(file)
print('Remove such file:%s' % file)
else:
print('No such file:%s' % file)
self.zipfile = zipstream.ZipFile(mode = 'w', compression = zipstream.ZIP_DEFLATED) def zip_file(self, file, name):
if os.path.isfile(file):
arcname = os.path.basename(file)
self.zipfile.write(file, arcname = arcname)
else:
self.zip_folder(file, name) def zip_folder(self, folder, name = 'downloads'):
for file in os.listdir(folder):
full_path = os.path.join(folder, file)
if os.path.isfile(full_path):
self.zipfile.write(full_path, arcname = os.path.join(name, os.path.basename(full_path)))
elif os.path.isdir(full_path):
self.zip_folder(full_path, os.path.join(name, os.path.basename(full_path))) def close(self):
if self.zipfile:
self.zipfile.close()

四、保存下载

  

    excel.save()

    dt = datetime.datetime.now()
ecarxzip.zip_folder(DOWNLOAD_URL)
response = StreamingHttpResponse(ecarxzip.zipfile, content_type = 'application/zip')
response['Content-Disposition'] = 'attachment;filename={} {}.zip'.format("Batch report", dt.strftime(' %Y-%m-%d %H-%M-%S'))
print("end batch downloading...")
return response

贴下源码:

def batch_download(request, task_id):
print("batch start downloading...", task_id) ai_task = AITask.objects.get(id = task_id)
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")
else:
domains = {} 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'] sheet_data = {}
ecarxzip = ZipFile() #保存Excel文档前,清空downloads文件夹
for domain in domains:
domain_name = domain["domain_name"]
reports = ai_task.report.filter(semantic__classification__domain_name__exact = domain_name) if len(reports):
pass_no = fail_no = 0
for report in reports:
semantic = report.semantic
classification = semantic.classification
sheet_name = classification.third_classification_Number if classification.third_classification_Number else domain_name
if sheet_name not in sheet_data:
sheet_data[sheet_name] = {title: [] for title in domain_title} sheet_data[sheet_name][domain_title[0]].append(classification.domain_name)
sheet_data[sheet_name][domain_title[1]].append(classification.first_classification)
sheet_data[sheet_name][domain_title[2]].append(classification.second_classification)
sheet_data[sheet_name][domain_title[3]].append(semantic.name)
sheet_data[sheet_name][domain_title[4]].append(classification.semantic_property)
sheet_data[sheet_name][domain_title[5]].append(classification.intent_group)
sheet_data[sheet_name][domain_title[6]].append(classification.intent)
sheet_data[sheet_name][domain_title[7]].append(report.result)
sheet_data[sheet_name][domain_title[8]].append(report.in_handle_time)
sheet_data[sheet_name][domain_title[9]].append(report.ex_handle_time)
sheet_data[sheet_name][domain_title[10]].append(report.server_domain)
sheet_data[sheet_name][domain_title[11]].append(report.description) if "pass" == report.result:
pass_no += 1
elif "fail" == report.result:
fail_no += 1 excel = pandas.ExcelWriter('{}/{}.xlsx'.format(DOWNLOAD_URL, domain_name), engine = 'xlsxwriter')
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) summary_data = [domain_name, pass_no, fail_no]
summary_df = pandas.DataFrame({})
summary_df.to_excel(excel, sheet_name = "Summary", index = False, header = False)
worksheet = excel.sheets['Summary']
for index in range(len(summary_title)):
worksheet.write(0, index, summary_title[index], header_format)
worksheet.write(1, index, summary_data[index], body_format) order_sheet = []
for sheet in sheet_data:
order_sheet.append(sheet) order_sheet.sort(key = lambda param: ''.join([no.rjust(2, '') for no in param.split('.')]))
for sheet in order_sheet:
sheet_df = pandas.DataFrame(sheet_data[sheet])
sheet_df.to_excel(excel, sheet_name = sheet, index = False, header = False, startrow = 1) worksheet = excel.sheets[sheet]
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) excel.save()
sheet_data.clear() #回收内存 summary_dict['Domain'].append(domain_name)
summary_dict['Pass'].append(pass_no)
summary_dict['Fail'].append(fail_no) excel = pandas.ExcelWriter('{}/Summary.xlsx'.format(DOWNLOAD_URL), engine = 'xlsxwriter') summary_df = pandas.DataFrame({})
summary_df.to_excel(excel, sheet_name = 'Summary', index = False, startrow = 1) workbook = excel.book
body_format = workbook.add_format(style.body_style)
header_format = workbook.add_format(style.head_style) worksheet = excel.sheets['Summary']
for col in range(len(summary_title)):
title = summary_title[col]
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() dt = datetime.datetime.now()
ecarxzip.zip_folder(DOWNLOAD_URL)
response = StreamingHttpResponse(ecarxzip.zipfile, content_type = 'application/zip')
response['Content-Disposition'] = 'attachment;filename={} {}.zip'.format("Batch report", dt.strftime(' %Y-%m-%d %H-%M-%S'))
print("end batch downloading...")
return response

  

Python/Django 批量下载Excel的更多相关文章

  1. Python 爬虫批量下载美剧 from 人人影视 HR-HDTV

    本人比較喜欢看美剧.尤其喜欢人人影视上HR-HDTV 的 1024 分辨率的高清双字美剧,这里写了一个脚本来批量获得指定美剧的全部 HR-HDTV 的 ed2k下载链接.并依照先后顺序写入到文本文件, ...

  2. python多线程批量下载远程图片

    python多线程使用场景:多线程采集, 以及性能测试等 . 数据库驱动类-简单封装下 mysqlDriver.py #!/usr/bin/python3 #-*- coding: utf-8 -*- ...

  3. django 操作 下载 excel xls xlsx csv

    网站开发离不开数据的导入导出,本文将介绍一下django如何操作excel 先安装 django-excel pip install django-excel 配置一下url url(r'^downl ...

  4. python 作业 批量读取excel文件并合并为一张excel

    1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...

  5. Java 批量下载excel,并对excel赋值,压缩为zip文件(POI版)

    package com.neusoft.nda.servlet; import java.io.File;import java.io.FileInputStream;import java.io.F ...

  6. 用Python程序批量删除excel里面的图片

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Rhinoceros PS:如有需要Python学习资料的小伙伴可以 ...

  7. Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  8. python django 批量上传文件并绑定对应文件的描述

  9. django下载excel,使用django-excel插件

    django下载Excel,使用django-excel插件 由于目前的资料多是使用pandas或xlwt库实现的.其实没有那么的麻烦,因为django有相对应的插件django-excel. 该插件 ...

随机推荐

  1. js获取昨天,最近7天,最近30天通用方法

    function formatDate (val) { // 格式化时间 let start = new Date(val) let y = start.getFullYear() let m = ( ...

  2. Meanshift,聚类算法

    记得刚读研究生的时候,学习的第一个算法就是meanshift算法,所以一直记忆犹新,今天和大家分享一下Meanshift算法,如有错误,请在线交流. Mean Shift算法,一般是指一个迭代的步骤, ...

  3. opengl 对投影变化函数的理解

    投影变化分两种: 1 . 平行投影       2 . 透视投影 投影变化的设置一般放在reshape函数当中调用 每次要对投影变化进行操作的时候我们需要修改矩阵的变化模式,指定它为投影变化 glMa ...

  4. 线段树题集 (cf版)

    lazy区间修改   : http://acm.hdu.edu.cn/showproblem.php?pid=4902   (hdu4902) http://acm.hdu.edu.cn/showpr ...

  5. 分块试水--CODEVS5037 线段树练习4加强版

    感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间? ...

  6. python实现汉诺塔算法

    汉诺塔 算法分析 1.步骤1:如果是一个盘子,直接将a柱子上的盘子从a移动到c 否则 2.步骤2:先将A柱子上的n-1个盘子借助C移动到B(图1) 已知函数形参为hanoi(n,a,b,c),这里调用 ...

  7. shell中的四种模式匹配

    POSIX为shell为进行模式匹配提供了四种参数替换结构(老版本的shell可能不支持),每种结构有两个参数:变量名(或变量号)及模式. 第一种模式:    ${variable%pattern}, ...

  8. jstl自己定义函数的使用

    因为本人之前并没有接触过jstl标签,说来也可笑,之前一直使用struts2标签.近期项目用到jstl,所以做些记录方便以后自己查看. jstl的强大原因之中的一个我觉得就是他的自己定义函数,我们能够 ...

  9. android 线程的开启和停止(借鉴java的技术)

    在onclick()点击事件中的 // 上传地理位置 case R.id.person_up_locat: System.out.println("====输出了.. .. ====&quo ...

  10. 微信JS-SDK怎样使用

    前两天要用到微信JS库的的一句话--wx.closeWindow();可是整个调用过程有点儿泪奔了.. .. 尽管开发人员平台上说的清清楚楚,可是使用起来就是not ok! 一,绑定域名 登录到微信公 ...