2017-11-18 171 views
0

我想從窗體中獲取一些xlsx文件,我使用openpyxl加載它們並執行一些數據處理..最後我需要將所有處理過的xlsx文件壓縮到用戶。多個openpyxl xlsx工作簿放入一個.zip文件下載

這裏是我做了什麼至今

if form.is_valid(): 

    s = StringIO.StringIO() 
    zf = zipfile.ZipFile(s, mode="w") 

    for xlsx in request.FILES.getlist('xlsxs'): 

     element_column = "G" 
     element_row = 16 

     massar_column = "C" 
     massar_row_start = 18 

     loop = column_index_from_string(element_column) 
     while (loop <= ws.max_column): 
      for i in range(massar_row_start, ws.max_row+1): 
       # ... 
       ws["%s%s" % (element_column,i)] = 0 
       # ... 

      loop+=2 
      element_column = get_column_letter(loop) 

     buf = save_virtual_workbook(wb) 
     zf.write(buf) # or zf.write(wb) 

    zf.close() 
    response = HttpResponse(s.getvalue(), content_type="application/x-zip-compressed") 
    response['Content-Disposition'] = "attachment; filename=notes.zip" 
    return response 

一個例子,我得到的錯誤提前爲你能提供任何幫助

TypeError at My_view 
stat() argument 1 must be encoded string without null bytes, not str 

感謝。

+0

報告錯誤時,您應該提供完整的堆棧跟蹤 - 它會告訴您和我們實際錯誤的位置。您還應該包括Python版本以及其他庫(Django?)和其他版本。 – spookylukey

+0

@spookylukey錯誤是在行'zf.write(buf)'我正在使用django 1.10與python 2.7.12 – ppp0h

回答

0

save_virtual_workbook返回一個字節流 - source

您正在將此值傳遞到期望文件名的ZipFile.write

我認爲你應該使用ZipFile.writestr,並且你需要提供一個文件名,這個文件名將在檔案中使用。我不確定你如何得到你所看到的錯誤信息,但這是我能看到的第一個錯誤。

+0

zf.writestr(xlsx.name,buf)修復了這個問題。謝謝 – ppp0h

相關問題