1. 程式人生 > >django 一鍵生成excel表格並下載到本地,並根據時間刪除檔案,上傳excel檔案

django 一鍵生成excel表格並下載到本地,並根據時間刪除檔案,上傳excel檔案

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()
                }
            }
        });
    }