前面我們已經實現了利用python-docx庫自動生成表格簡化工作流程的python腳本。具體請看:生活中的python-利用python-docx自動生成表格簡化工作流程
但是python腳本的缺點就是,如果想讓其他人使用,必須在其電腦上安裝相應的python環境。這對于電腦不熟練的人來說還是相當有難度的。于是就有了這篇文章---用Flask生成我們需要的word文件,之后將web程序部署到公網服務器上,這樣任何人都可以輕松的使用了。
整體思路很簡單,就是做一個web表單,然后在Flask里處理最后生成word供下載即可
關于如何生成word部分直接看上面的文章即可,這里說明下Flask部分需要注意的地方
一、使用BYtesIO讀寫數據
BYtesIO實現在內存中讀寫數據,我們這里可以先將生成的word文件放在服務器的內存上,然后供下載,代碼如下:
f = io.BytesIO()
document.save(f)
f就是我們生成的word文件并且放在了服務器的內存中。
二、Flask下載中文名文件
正常情況下,我們使用Flask的send_file下載文件沒有問題,但是如果要下載的文件名是中文的話,就會出現編碼錯誤。
解決方法就是從urllib.parse引入quote,首先對文件名進行編碼,然后send_file中作為attachment_filename的參數,這時候能成功下載文件,但是文件名是編碼后的名字,要解碼的話,我們需要在headers里面聲明編碼格式,即:
filename = quote(name + '清單.doc')
rv = send_file(f, as_attachment=True, attachment_filename=filename)
rv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)
這樣,對文件名進行UTF-8解碼,Flask就可以正常下載中文名文件了
三、同時下載兩個(多個)文件問題
因為我的需求是輸入一次信息,生成兩個不同的word文件。而瀏覽器似乎無法實現一個submit按鈕同時下載兩個文件。所以,只能用兩個submit按鈕下載不同的word文件。這里我的思路是,將兩個submit按鈕設置成同樣的name值,不同的value值,然后通過request.form[]來獲取數據:
if request.form['key'] == '申請表下載':
pass
elif request.form['key'] == '清單下載':
pass
說明
源代碼已經上傳至:https://github.com/juventusryp/flask_create_word
下一篇將講述如何將web程序部署到公網服務器上。