2016-05-25 21 views
5

Bu yüzden geçmişte XLSXWriter kullanıyorum, iki panda veri çerçevesine sahip bir sekme içeren bir excel dosyasını dışa aktarıyorum. Geçmişte dosyayı sadece kullanıcının bilgisayarında yerel bir yola ihraç ettim, ancak bir web arayüzüne geçiş yapıyorum.Flask sunucusu ve xlsxwriter ile Excel dışa aktarımı

İstenilen çıktı, aşağıdaki kod ile aynı excel dosyasına sahip olmak, ancak bellekte oluşturulup web arayüzünden indirmesi için kullanıcıya gönderilmesidir. Çok fazla Django ve StringIO görüyorum ama Flask ile çalışabilecek bir şey arıyorum ve aslında işe yaramış hiçbir şey bulamadım.

Bu problemi bilen var mı?

Şimdiden teşekkürler!

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

kullandığınız Pandalar versiyonu? –

+0

Pandas 0.17.1 ve Python 3.5.1 kullanıyorum –

cevap

4

kullanarak excel dosyası yazmak isteyebilirsiniz.

Pandas ExcelWriter, Flask ve send_file aracılığıyla kullanıcıya geri gönderilen bir BytesIO akışına yazar.

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) 

Referanslar:

+0

Bu mükemmel bir çözüm, bir cazibe gibi çalıştı! Teşekkürler! –

2

Eğer benzer bir şey kullanabilirsiniz:

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) 

ayrıca şu pasajı Python 3.4 64 bit ile Win10 üzerinde çalışır tempfile

İlgili konular