2016-05-25 7 views
5

So habe ich XLSXWriter in der Vergangenheit verwendet, um eine Excel-Datei zu exportieren, die eine Registerkarte mit zwei Pandas Datenrahmen enthält. In der Vergangenheit habe ich nur die Datei in einen lokalen Pfad auf dem Computer des Benutzers exportiert, aber ich mache den Übergang zu einer Webschnittstelle.Excel-Export mit Flask-Server und xlsxwriter

Meine gewünschte Ausgabe soll dieselbe Excel-Datei wie der unten stehende Code haben, aber im Speicher erstellt und an den Benutzer gesendet werden, damit er sie über die Web-Schnittstelle herunterladen kann. Ich habe viel Django und StringIO gesehen, aber ich suche nach etwas, das mit Flask funktionieren könnte und ich konnte nichts finden, was wirklich funktioniert hat.

Ist jemand mit diesem Problem vertraut?

Vielen Dank im Voraus!

xlsx_path = "C:\test.xlsx" 
writer = pd.ExcelWriter(xlsx_path, engine='xlsxwriter') 

df_1.to_excel(writer,startrow = 0, merge_cells = False, sheet_name = "Sheet_1") 
df_2.to_excel(writer,startrow = len(df_1) + 4, merge_cells = False , sheet_name = "Sheet_1")        

workbook = writer.book 
worksheet = writer.sheets["Sheet_1"] 
format = workbook.add_format() 
format.set_bg_color('#eeeeee') 
worksheet.set_column(0,9,28) 

writer.close() 
+0

, welche Version von Pandas verwenden Sie? –

+0

Ich benutze Pandas 0.17.1 und Python 3.5.1 –

Antwort

4

Der folgende Ausschnitt funktioniert auf Win10 mit Python 3.4 64bit verwenden.

Der Pandas ExcelWriter schreibt in einen BytesIO Stream, der dann über Flask und send_file an den Benutzer zurückgesendet wird.

import numpy as np 
import pandas as pd 
from io import BytesIO 
from flask import Flask, send_file 

app = Flask(__name__) 
@app.route('/') 

def index(): 

    #create a random Pandas dataframe 
    df_1 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD')) 

    #create an output stream 
    output = BytesIO() 
    writer = pd.ExcelWriter(output, engine='xlsxwriter') 

    #taken from the original question 
    df_1.to_excel(writer, startrow = 0, merge_cells = False, sheet_name = "Sheet_1") 
    workbook = writer.book 
    worksheet = writer.sheets["Sheet_1"] 
    format = workbook.add_format() 
    format.set_bg_color('#eeeeee') 
    worksheet.set_column(0,9,28) 

    #the writer has done its job 
    writer.close() 

    #go back to the beginning of the stream 
    output.seek(0) 

    #finally return the file 
    return send_file(output, attachment_filename="testing.xlsx", as_attachment=True) 

app.run(debug=True) 

Referenzen:

+0

Dies ist die perfekte Lösung, arbeitete wie ein Charme! Vielen Dank! –

2

können Sie etwas ähnliches wie verwenden:

from flask import Flask, send_file 
import io 

myio = io.StringIO() 

with open(xlsx_path, 'rb') as f: 
    data = f.read() 

myio.write(data) 
myio.seek(0) 

app = Flask(__name__) 

@app.route('/') 

send_file(myio, 
      attachment_filename="test.xlsx", 
      as_attachment=True) 

app.run(debug=True) 

Sie auch Ihre Excel-Datei schreiben möchten tempfile

Verwandte Themen