2016-07-19 82 views
0

我正在創建一個Flask應用程序,該應用程序提示用戶輸入Excel文件,執行一些操作,然後將文件返回給用戶,以便他們可以下載它。 (請忽略任何未使用的進口,我計劃在以後使用它們。)返回Flask應用程序中的Excel文件

我有我的功能下降,我只是不知道如何將文件發送回用戶,以便他們可以下載它。預先感謝任何幫助!

這是我到目前爲止有:(注:我也不太清楚,如果我實現正確上傳功能)

from openpyxl import load_workbook 
from flask import Flask, request, render_template, redirect, url_for 


app = Flask(__name__) 

@app.route('/') 
def index(): 
    return """<title>Upload new File</title> 
    <h1>Upload new File</h1> 
    <form action="/uploader" method=post enctype=multipart/form-data> 
     <p><input type=file name=file> 
     <input type=submit value=Upload> 
    </form>""" 

@app.route('/uploader', methods = ['GET', 'POST']) 
def upload(): 
    if request.method == 'POST': 
     f = request.files['file'] 
     f.save(f.filename) 
     return process(f.filename) 

def process(filename): 

    routename = ['ZYAA', 'ZYBB', 'ZYCC'] 
    supervisors = ['X', 'Y', 'Z'] 
    workbook = load_workbook(filename) 
    worksheet = workbook.active 
    worksheet.column_dimensions.group('A', 'B', hidden=True) 
    routes = worksheet.columns[2] 
    i = 2 
    worksheet['D1'] = 'Supervisor' 
    for route in routes: 
     if route.value in routename: 
      pos = routes.index(route) 
      worksheet['D' + str(i)].value = supervisors[pos] 
      print (route.value) 
      i += 1 

    workbook.save(filename) 




if __name__ == '__main__': 
    app.run(debug = True, host = '0.0.0.0') 

回答

1

這取決於如果你想保持你的服務器/計算機或文件不。你可以做這樣的事情,以保持文件:

from flask import send_from_directory 

def process(): 
    # do what you're doing 

    file_name = 'document_template.xltx' 
    wb = load_workbook('document.xlsx') 
    wb.save(file_name, as_template=True) 

    return send_from_directory(file_name, as_attachment=True) 

如果你不想保留的文件,片段可以幫助你。

+0

感謝您的答案!當我開始工作時我會嘗試他們。我的上傳功能是否正確,是否將文件正確傳遞給我的處理功能? – Harrison

+0

我想它會起作用。 –

+0

我真的不確定如何做stringIO的方式。我如何將我的excel文件寫入到stringIO對象?我目前正在這樣做: return send_file(filename,attachment_filename ='output.xls',as_attachment = True) – Harrison