前言
我認為Django編程完全可以作為個人全棧的一個起點。
Python語言上手快,這些優(yōu)點就不用說了;
Django用戶基數(shù)大,這就意味著你發(fā)現(xiàn)的問題,Stack Overflow上可能已經(jīng)有了完美的解決方案;
Django編程功能模塊全,可選擇余地多,可以整合的Python庫更多,這點可以看看awesome-django, awesome-python等項目,一旦發(fā)現(xiàn)那些感興趣的,就可以深入進去不斷研究,發(fā)展自己的技能點。
最重要的一點,很討厭的一點是大公司今天發(fā)布了一個技術(shù),可能過些年就宣布廢棄了,被他們“騙”了多年后,痛定思痛,現(xiàn)在就想學習一個相對壽命能長一些的技術(shù)棧,這些技術(shù)完全可以組合完成絕大部分中小項目的開發(fā),Django&Python完成能符合這個目標。
最后,“Django編程”公眾號會不定期的更新關(guān)于Django編程相關(guān)的知識點,力求涉及全棧,也保證會根據(jù)心情,隨機亂入其他類型的文章,歡迎大家多多支持,多多交流!
正文
在項目中經(jīng)常會遇到導出Word文檔,而當文檔格式比較復(fù)雜,要填充的內(nèi)容較多,經(jīng)過調(diào)查,發(fā)現(xiàn)采用python-docx-template庫是一個很好的實現(xiàn)方式。在這里記錄一下我們項目中使用過程。
python-docx-template庫的一些情況:
Github路徑:https://github.com/elapouya/python-docx-template
它是一個Python庫,但是可以用在Django中,這一點我已經(jīng)實踐過。
Jinja2語法
模板化處理,創(chuàng)建好模塊就可以替換諸如圖片,表格,頁眉等等一切你想替換的內(nèi)容。
小眾庫,國內(nèi)用的不多,Github最新更新3個月前,210個星。
使用這個庫很簡單,創(chuàng)建要生成Word的模板,然后在實際使用中替換模板內(nèi)容即可。
使用步驟1. 創(chuàng)建一個word模板
項目模板統(tǒng)一放在了\media\fb_dir\docx_tpl中:名為eval_task_tpl.docx
模塊語法講解:
循環(huán)獲取report_list中的內(nèi)容,并且每行顯示對應(yīng)的內(nèi)容。
使用步驟2. Django創(chuàng)建View函數(shù)
python-docx-template生成模板的功能比我使用的要多很多,可以參考使用文檔:http://docxtpl.readthedocs.io/en/latest/
根據(jù)模板生成文檔部分代碼
file_location=u'media/fb_dir/eval_task_result_docx/%d_%s_考評結(jié)果.docx' % (eval_task.id,eval_task.name)if not os.path.exists(file_location): print('eval task docx not exist, generating... ') Scoring_report_list = ScoringFinalReport.objects.all() #建立模板實例 doc = DocxTemplate('media/fb_dir/docx_tpl/eval_task_tpl.docx') #建立文檔內(nèi)容 context1 = { 'report_list': Scoring_report_list } #將模板內(nèi)容與模板關(guān)聯(lián) doc.render(context1) #導出并保存文檔 doc.save(file_location)
彈出下載框部分
content = open(file_location, 'rb').read()response = HttpResponse(content, content_type='application/octet-stream')response['Content-Disposition'] = 'attachment; filename={0}'.format(urlquote(file_name)) #IE EDGE
使用步驟3. 創(chuàng)建該函數(shù)的Url映射
url(r'^export_eval_task/(?P\d+)$', views.export_eval_task, name='ExportEvalTask'),
使用步驟4. 前臺界面調(diào)用
最后上效果圖
下載效果圖:
導出Word結(jié)果: