Экспорт Excel с помощью сервера Flask и xlsxwriter
поэтому я использовал XLSXWriter в прошлом для экспорта файла excel, содержащего одну вкладку, заполненную двумя кадрами данных pandas. В прошлом я только экспортировал файл в локальный путь на компьютере пользователя, но я делаю переход к веб-интерфейсу.
мой желаемый результат должен иметь тот же файл excel, что и приведенный ниже код, но созданный в памяти и отправленный пользователю для загрузки через веб-интерфейс. Я видел много Джанго и StringIO, но я ищете что-то, что может работать с фляжкой, и я не мог найти ничего, что действительно работало.
кто-нибудь знаком с этой проблемой?
спасибо заранее!
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()
2 ответов
следующий фрагмент работает на Win10 с Python 3.4 64bit.
панды ExcelWriter пишет в BytesIO
поток, который затем отправляется обратно пользователю через Flask
и send_file
.
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)
ссылки:
вы можете использовать что-то подобное этой:
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)
вы также можете написать свой файл excel с помощью tempfile