Экспорт 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