2017-03-22 2 views
0

ich eine Excel-Datei erschaffe openpyxl verwendet, die ich als Datei herunterladen zurückkehren möchte (also nicht lokal speichern).zurückgeben erstellt Excel-Datei mit Kolben

lege ich die Excel-Datei in Ordnung und auf der Festplatte speichern. Ich kann diese Datei jedoch nicht herunterladen.

Versuch 1:

import flask_excel as excel 

... 

create_excel_sheet(data) # internally save the sheet with name sheet.xlsx 

output = excel.make_response() 
output.headers["Content-Disposition"] = "attachment; filename=" + \ 
             'sheet.xlsx' 
output.headers["Content-type"] = "application/vnd.openxmlformats-\ 
officedocument.spreadsheetml.sheet" 

return output 

Dies gibt eine leere Textdatei mit dem Namen sheet.xlsx

Versuch 2: wb = create_excel_sheet (Daten) # Rückkehr openpyxl Arbeitsmappe

output = excel.make_response(wb) 
output.headers["Content-Disposition"] = "attachment; filename=" + \ 
             'sheet.xlsx' 
output.headers["Content-type"] = "application/vnd.openxmlformats-\ 
officedocument.spreadsheetml.sheet" 

return output 

Ich möchte nicht pyexcel für die Daten verwenden, da ich openpyxl brauche, um ein schickes Excel-Blatt zu erstellen. Offensichtlich, wenn pyexcel und openpyxl kommunizierten, wäre das in Ordnung.

irgendwelche Gedanken?

Cheers, Mike

+0

openpyxl Sie in einer Datei wie Objekt mit 'save_virtual_workbook()' –

+0

Das ist es zu retten erlaubt! Danke – Mike

Antwort

1

Basierend auf Charlie Clark Hinweis, ich auf folgende Lösung endgültig entschieden.

output = make_response(create_sheet(data)) 
output.headers["Content-Disposition"] = "attachment; filename=" + \ 
             "sheet.xlsx" 
output.headers["Content-type"] = \ 
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 

wo

def create_sheet(data): 

kehrt

return save_virtual_workbook(wb) 
1

Was ich tat, als ich das gleiche Problem konfrontiert ist, dass ich eine temporäre Datei auf dem Server geschrieben, habe ich meine create_excel_sheet(data) Funktion Dateinamen zurückzukehren und dann die Datei mit dem Kolben zurückzuschicken send_file() Funktion:

send_file(create_excel_sheet_and_return_filename(data)) 

Sie python-Module verwenden können, die temporären Dateien erstellen, die gelöscht werden, wenn das Verfahren und die Genehmigung Verwendung liegt vor, wenn Sicherheit ein Problem.

+0

Danke! Das scheint zu funktionieren, aber meine Templates addieren sich nun in meinem/tmp/dir. Ich benutzte den Ansatz in: http://stackoverflow.com/questions/31391344/using-tempfile-to-create-pdf-xls-documents-in-flask – Mike

+0

hast du mit Lösch = True die benannte temporäre Datei erstellen? https://docs.python.org/2/library/tempfile.html#tempfile.NamedTemporaryFile – grepe

0

Dass alle korrekt aussieht. Geben Sie die Antwort aus Ihrer Sicht zurück? Das war in der Frage nicht klar und würde das Problem erklären, denke ich.

Zum Beispiel:

@app.route('/download_sheet') 
def download(): 
    create_excel_sheet(data) 
    output = excel.make_response() 
    output.headers["Content-Disposition"] = "attachment; filename=sheet.xlsx" 
    output.headers["Content-type"] = "application/vnd.openxmlformats-\ 
officedocument.spreadsheetml.sheet" 
    return output # Send the response to the user 

...

<a href="{{ url_for('app.download') }}">Click here for Sheet</a> 
+1

I-Ausgang tun zurückkehren (edited oben). Mein Problem (jetzt) ​​ist die Datei zurückzukehren, ohne mein Gedächtnis Füllung mit Provisorien – Mike

+0

Hm - Es scheint, wie die temporäre Datei Lösung arbeitet. Wie wäre es also mit der App, die temporäre Dateien in regelmäßigen Abständen sucht und entfernt? –