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