2014-11-21 16 views
7

Ich versuche erstellen und Excel-Dateien mit Django zu dienen. Ich habe eine Jar-Datei, die Parameter erhält und eine Excel-Datei nach Parametern erzeugt und es funktioniert ohne Probleme. Aber wenn ich versuche, die produzierte Datei zu bekommen und sie dem Benutzer zum Download zu liefern, kommt die Datei kaputt. Es hat 0kb Größe. Dies ist der Codestück, den ich für die Excel-Generierung und -Dienstleistung verwende.Serving Excel (xlsx) -Datei für den Benutzer zum Download in Django (Python)

Ich habe nach möglichen Lösungen gesucht und versucht, File Wrapper auch zu verwenden, aber das Ergebnis hat sich nicht geändert. Ich nehme an, ich habe ein Problem mit dem Lesen der xlsx-Datei in StringIO-Objekt. Aber haben Sie keine Ahnung, wie Sie es beheben können

Antwort

3

Zusätzlich zu dem, was Bruno sagt, müssen Sie wahrscheinlich die Datei in Binär-Modus öffnen:

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

Warum in aller Welt übergeben Sie den Inhalt Ihrer Datei an eine StringIO, nur StringIO.get_value() zu einer lokalen Variablen zuweisen? Was ist falsch daran, file.read() direkt an deine Variable zu vergeben?

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 

Jetzt können Sie überprüfen weither Sie tatsächlich alle Inhalte in der Datei hatte - die Tatsache, dass die Datei, um sie irgendetwas in ihm hat, bedeutet nicht existiert. Denken Sie daran, dass Sie sich in einem Kontext befinden, in dem ein Thread oder Prozess versucht, die Datei zu lesen, während ein anderer (=> eine andere Anfrage) versucht, sie zu schreiben.

+0

Dank für Ihre Antwort. Das Problem war nicht, die Datei im Binärmodus zu lesen, aber ich habe auch meinen Code aktualisiert, indem ich Ihr Feedback verwendete. Hoffe, es sieht besser aus :) http://pastebin.com/ydzR2uuP – Srht

+0

SO ist nicht der Ort für Code-Review (Sie möchten codereview.stackexchange.com überprüfen), aber hier ist die Antwort http://pastebin.com/ e4zRAW5U –