2016-05-25 4 views
5

Итак, я использовал XLSXWriter в прошлом, чтобы экспортировать файл excel, содержащий одну вкладку, заполненную двумя файловыми кадрами pandas. Раньше я только экспортировал файл в локальный путь на компьютере пользователя, но я делаю переход к веб-интерфейсу.Экспорт Excel с сервером Flask и xlsxwriter

Мой желаемый результат должен иметь тот же файл excel, что и код ниже, но создан в памяти и отправлен пользователю для его загрузки через веб-интерфейс. Я видел много Django и StringIO, но я ищу что-то, что может работать с Flask, и я не мог найти ничего, что действительно сработало.

Кто-нибудь знаком с этой проблемой?

Заранее благодарен!

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

версию Панды вы используете? –

+0

Я использую Pandas 0.17.1 и Python 3.5.1 –

ответ

4

Следующий фрагмент кода работает на Win10 с Python 3.4 64bit.

Pandas 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) 

Ссылки:

+0

Это идеальное решение, работающее как шарм! Благодаря! –

2

вы можете использовать что-то похожее на :

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

Смежные вопросы