django 一鍵生成excel表格並下載到本地,並根據時間刪除檔案,上傳excel檔案
阿新 • • 發佈:2019-02-04
from django.http.response import HttpResponse, JsonResponse import datetime import os import xlwt import xlrd from django.http import StreamingHttpResponse def Export_excel(request):#生成EXCEL表格 if request.method=='POST': try: now = datetime.datetime.now() file_path = os.path.join(r'static/excel/','%s.xlsx'%now.strftime("%Y-%m-%d-%H-%M-%S")) f=list(os.listdir(mailpath)) #列出例項化的路徑下面的檔案(根據時間只保留最新建立的excel檔案,其中mailpath填寫自己的excel儲存路徑http://blog.51cto.com/net881004/2052066) for i in range(len(f)): #len統計多少個檔案,然後迴圈賦值給變數i。 maildate = os.path.getmtime(mailpath + f[i]) #獲取每個檔案的時間的時間 currdate = time.time() #當前時間 num1 =(currdate - maildate)/60 #當前時間減去檔案時間,然後換成乘天。 if num1 > 0: try: os.remove(mailpath + f[i]) except Exception as e: print(e) wb = xlwt.Workbook(encoding='utf-8')#開始建立excel LST_test = wb.add_sheet(now.strftime("%m-%d"))#excel中的表名 LST_test.write(0, 0, '編號') #列名 LST_test.write(0, 1, '使用者id') LST_test.write(0, 2, '建立時間') row = 1 datas =[#要用到的資料] for i in datas: LST_test.write(row, 0, int(i.id))#row為每一行要新增的資料,0為第幾列,最後的是要新增的資料 LST_test.write(row, 1, i.user_id_id) LST_test.write(row, 2, i.create_time.strftime("%Y-%m-%d %H:%M:%S")) row = row + 1 wb.save(file_path)#儲存 return JsonResponse({'code':0,'data':file_path})#將路徑返回到前臺 except Exception as e: print(e) return JsonResponse({'code': 1, 'data': '匯出表格失敗!'})
#這裡是前臺html程式碼
function Export_excel(arg){ $.ajax({ url:'/Export_excel/', type:'post', data:{},#自己要傳的資料 success:function(arg){ if (arg.code===0){ window.location.href='/download?data='+arg.data+''; }else{ alert(arg.data) } },error:function(){ alert('匯出失敗'); } }) }
#下載的方法
Django的HttpResponse物件允許將迭代器作為傳入引數,將上面程式碼中的傳入引數c換成一個迭代器,便可以將上述下載功能優化為對大小檔案均適合;而Django更進一步,推薦使用StreamingHttpResponse物件取代HttpResponse物件,StreamingHttpResponse物件用於將檔案流傳送給瀏覽器,與HttpResponse物件非常相似,對於檔案下載功能,使用StreamingHttpResponse物件更合理。
連結:https://www.jianshu.com/p/ce8c17b4a7fd
def download(request): try: filename = request.GET.get('data',None) def file_iterator(file_name): with open(file_name, 'rb')as f: while True: c = f.read(512) if c: yield c else: break response = StreamingHttpResponse(file_iterator(filename)) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = "attachment;filename={0}".format(filename.split('/')[2])#這裡改成自己需要的檔名 return response except Exception as e: print (e)
下面再 新增一個匯入的函式
def read_excel(request):
if request.method == 'POST':
try:
img = request.FILES.get('file',None)#獲得使用者上傳的excel
oldName = img.name
if str(oldName.split(".")[1]) == 'xlsx':#判斷格式
filename = str(int(time.time() * 10)) + "." + oldName.split(".")[1]
dirpath = os.path.join(r'static/excel/',filename)
with open(dirpath,'wb+') as destination:
for chunk in img.chunks():
destination.write(chunk)
xlsfile =dirpath # 開啟指定路徑中的xlsx檔案(讀取excel的內容)
book = xlrd.open_workbook(xlsfile) # 得到Excel檔案的book物件,例項化物件
sheet0 = book.sheet_by_index(0) # 通過sheet索引獲得sheet物件
col_data1 = sheet0.col_values(0) #獲得第一列的資料
col_data = sheet0.col_values(-1) # 獲得最後1列的資料列表
return JsonResponse({'code':0})
else:
return JsonResponse({'code':2,'data':'請匯入正確格式的表格!'})
except Exception as e:
print (e)
匯入的前臺程式碼
<label for="exampleInputFile"></label>
<input id='img' type="file" name="file"/>
<button style="border: 1px solid black;width: 60px;height: 30px;margin-top:30px;margin-left:30px;text-align: center;line-height: 15px;background:#c0c0c0;" onclick="FileUpload()">匯入</button>
function FileUpload() {
var form_data = new FormData();
var file_info = $('#img')[0].files[0];
form_data.append('file',file_info);
if(file_info===''){
alert('你沒有選擇任何檔案');
return false;
}
$.ajax({
url:"{% url 'read_excel' %}",
type:'POST',
data: form_data,
processData: false,
contentType: false,
success: function(j) {
if (j.code === 0){
alert('匯入成功!');
window.location.reload()
}else{
alert(j.data);
window.location.reload()
}
}
});
}