2014-11-21 8 views
7

Próbuję tworzyć i dostarczać pliki Excela za pomocą Django. Mam plik jar, który pobiera parametry i tworzy plik excel zgodnie z parametrami i działa bez problemu. Ale kiedy próbuję pobrać wyprodukowany plik i udostępnić go użytkownikowi do pobrania, plik zostanie zepsuty. Ma rozmiar 0kb. To jest kawałek kodu, którego używam do generowania i serwowania programu Excel.Obsługa pliku Excel (xlsx) do pobrania dla użytkownika w Django (Python)

def generateExcel(request,id): 
    if os.path.exists('./%s_Report.xlsx' % id): 
     excel = open("%s_Report.xlsx" % id, "r") 
     output = StringIO.StringIO(excel.read()) 
     out_content = output.getvalue() 
     output.close() 
     response = HttpResponse(out_content,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
     response['Content-Disposition'] = 'attachment; filename=%s_Report.xlsx' % id 
     return response 
    else: 
     args = ['ServerExcel.jar', id] 
     result = jarWrapper(*args) # this creates the excel file with no problem 
     if result: 
      excel = open("%s_Report.xlsx" % id, "r") 
      output = StringIO.StringIO(excel.read()) 
      out_content = output.getvalue() 
      output.close() 
      response = HttpResponse(out_content,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
      response['Content-Disposition'] = 'attachment; filename=%s_Report.xlsx' % id 
      return response 
     else: 
      return HttpResponse(json.dumps({"no":"excel","no one": "cries"})) 

Szukałem możliwych rozwiązań i starałem się również używać Owijarki plików, ale wynik nie został zmieniony. Zakładam, że mam problem z odczytaniem pliku xlsx do obiektu StringIO. Ale nie mam pojęcia, jak to naprawić:

Odpowiedz

3

Oprócz tego, co mówi Bruno, prawdopodobnie trzeba otworzyć plik w trybie binarnym:

excel = open("%s_Report.xlsx" % id, "rb") 
6

Dlaczego przekazujesz zawartość pliku do StringIO tylko po to, aby przypisać StringIO.get_value() do zmiennej lokalnej? Co jest złego w przypisywaniu file.read() do swojej zmiennej bezpośrednio?

def generateExcel(request,id): 
    path = './%s_Report.xlsx' % id # this should live elsewhere, definitely 
    if os.path.exists(path): 
     with open(path, "r") as excel: 
      data = excel.read() 

     response = HttpResponse(data,content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
     response['Content-Disposition'] = 'attachment; filename=%s_Report.xlsx' % id 
     return response 
    else: 
     # quite some duplication to fix down there 

Teraz możesz sprawdzić weither rzeczywiście miał żadnych treści w pliku - fakt, że plik istnieje, nie oznacza, że ​​nie ma nic w nim. Pamiętaj, że jesteś w kontekście współbieżnym, możesz mieć jeden wątek lub proces próbujący odczytać plik, podczas gdy inny (=> inny wniosek) próbuje go zapisać.

+0

dzięki za odpowiedź. Problem polegał na tym, że nie czytałem pliku w trybie binarnym, ale zaktualizowałem też swój kod, wykorzystując Twoją opinię. Mam nadzieję, że wygląda lepiej :) http://pastebin.com/ydzR2uuP – Srht

+0

SO nie jest miejscem do przeglądu kodu (możesz chcieć sprawdzić codereview.stackexchange.com), ale oto odpowiedź http://pastebin.com/ e4zRAW5U –