Serving Excel (xlsx) Datei an den Benutzer zum Download in Django (Python)

Ich versuche zu erstellen und Excel-Dateien mit Django. Ich habe eine JAR-Datei, die Parameter bekommt und produziert eine Excel-Datei nach Parametern und es funktioniert ohne Problem. Aber wenn ich versuche, die produzierte Datei zu bekommen und dem Benutzer zum Download zu dienen, kommt die Datei kaputt. Es hat 0kb Größe. Dies ist das Code-Stück, das ich für Excel-Generierung und Serving verwenden.

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"})) 

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 Probleme beim Lesen der xlsx-Datei in StringIO-Objekt. Aber habe keine Ahnung, wie man es beheben kann

3 Solutions collect form web for “Serving Excel (xlsx) Datei an den Benutzer zum Download in Django (Python)”

Zusätzlich zu dem, was Bruno sagt, müssen Sie wahrscheinlich die Datei im Binärmodus öffnen:

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

Warum hast du den Inhalt deiner Datei an einen StringIO , um StringIO.get_value() einer lokalen Variablen zuzuordnen? Was ist falsch mit der Zuweisung von file.read() an Ihre Variable direkt?

 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 möchtest du vielleicht weitermachen, dass du eigentlich irgendwelche Inhalte in deiner Datei hast – die Tatsache, dass die Datei existiert, bedeutet nicht, dass es etwas darin hat. Denken Sie daran, dass Sie in einem gleichzeitigen Kontext sind, können Sie einen Thread oder Prozess versuchen, die Datei zu lesen, während eine andere (=> eine andere Anfrage) versucht, es zu schreiben.

Sie können diese Bibliothek verwenden, um Excel-Blätter zu erstellen. http://xlsxwriter.readthedocs.io/

Weitere Informationen finden Sie auf dieser Seite. Danke an @alexcxe

XlsxWriter Objekt speichern als http Antwort zum Erstellen von Download in Django

  • Lesen von xlsx-Dateien mit Python [geschlossen]
  • Ist openpyxl das schnellste Paket zu verwenden, um große xlsx Dateien zu lesen?
  • Tragen Sie Stile beim Exportieren auf 'xlsx' in Pandas mit XlsxWriter an
  • Python ist die beste Programmiersprache der Welt.