django下载excel,使用django-excel插件
django下載Excel,使用django-excel插件
由于目前的資料多是使用pandas或xlwt庫實(shí)現(xiàn)的。其實(shí)沒有那么的麻煩,因?yàn)閐jango有相對應(yīng)的插件django-excel。
該插件是依賴于pyexcel庫寫的。不過,不用專門安裝pyexcel庫,因?yàn)樵诎惭bdjango-excel時(shí)會自動(dòng)將pyexcel裝上。由于pyexcel是一個(gè)大庫,且在使用django-excel時(shí)不用考慮pyexcel的使用方法,所以就不再此介紹太多了。在此,還是要多說一句,pyexcel的功能也是很強(qiáng)大的,可以實(shí)現(xiàn)數(shù)據(jù)的可視化,目前已開發(fā)出了與flask、django等web框架的對應(yīng)插件,比如今天介紹的django-excel。
django-excel是一款支持上傳和下載excel文件的插件,并可以將excel文件以網(wǎng)頁的形式展現(xiàn)出來,也可以將數(shù)據(jù)存入數(shù)據(jù)庫。由于,筆者也是剛接觸該插件,而且開發(fā)需求目前僅為下載功能,所以本篇只介紹其下載的功能。(注:實(shí)現(xiàn)下載功能,部署的服務(wù)器無需安裝office)
1、 安裝
pip install django-excel
安裝時(shí)會自動(dòng)安裝pyexcel-io、pyexcel、pyexcel-webio
pyexcel-xlsx需另外單獨(dú)安裝。否則在下載時(shí)會報(bào):OSError: No content, file name. Nothing is given的錯(cuò)誤。
2、 支持django的版本
目前已支持到django2.1.1版本。所以,使用目前django最新版的開發(fā)者也不用擔(dān)心了,因?yàn)樗С帧?/p>
3、 實(shí)現(xiàn)下載
該插件支持的數(shù)據(jù)格式很多,array(二維數(shù)組)、字典、數(shù)據(jù)庫的表(單張或多張)、django的ORM查詢結(jié)果(query sqt)等等。可以生成的文件類型:csv、tsv、csvz、tsvz、xls、xlsx、xlsm、ods。
| 包名 | 支持的文件格式 | 依賴 | Python版本 | 
| pyexcel-io | csv, csvz, tsv, tsvz | 2.6, 2.7, 3.3, 3.4, 3.5, 3.6 pypy | |
| pyexcel-xls | xls, xlsx(只讀), xlsm(只讀) | xlrd,xlwt | 同上 | 
| pyexcel-xlsx | xlsx | openpyxl | 同上 | 
| pyexcel-ods3 | ods | pyexcel-ezodf, lxml | 2.6, 2.7, 3.3, 3.4 3.5, 3.6 | 
| pyexcel-ods | ods | odfpy | 同上 | 
上表是生成對應(yīng)文件格式所需安裝的包。
如果是要使用二維數(shù)組生成excel文件,則需return django_excel.make_response_from_array(二維數(shù)組名,生成的文件類型,status=200)。二維數(shù)組每一行代表Excel中相應(yīng)的行。
如果想要使用字典生成excel文件,則需return django_excel.make_response_from_dict(字典名,文件類型,status=200)。鍵名為列名,鍵值為數(shù)據(jù)。
如果想要使用數(shù)據(jù)庫的表(單張)生成excel文件,則需return django_excel.make_response_from_a_table(表名,文件類型, status=200)
如果想要使用數(shù)據(jù)庫的表(多張)生成excel文件,則需return django_excel.make_response_from_tables(表名列表, 文件類型status=200)
如果想要使用查詢集合生成excel文件,則需return django_excel.make_response_from_query_sets(查詢集合名, 所需列對應(yīng)字段(列表類型),文件類型, status=200)。所需列對應(yīng)字段的列表里的順序?yàn)镋xcel列名的順序,且列表里的元素必須為model里的變量名。
所有函數(shù)的通用參數(shù)包含file_name 和sheet_name,分別為文件名和Excel的工作薄名。
注意,不論是數(shù)據(jù)庫表還是查詢集合,都不能包含外鍵否則會報(bào)錯(cuò),而且只能通過頁面的跳轉(zhuǎn)實(shí)現(xiàn)下載,不能通過ajax請求,否則不會下載。
eg:
models.py
class django_test_1(models.Model):
    abc = models.CharField(max_length=20,db_column='測試')
views.py
1 import django_excel as excel 2 3 def download_excel(request): 4 5 data_excel =django_test_1.objects.all() 6 7 column_names = ["abc"] 8 9 return excel.make_response_from_query_sets(data_excel,column_names, "xlsx",status = 200 ,sheet_name='測試',file_name='測試文件')
這是Xsan自己編寫的函數(shù),將pandas中的dataframe數(shù)據(jù)轉(zhuǎn)換成django-excel中的sheet參數(shù)
# 將dataform轉(zhuǎn)換成django-excel下載是的sheet
def dataframe_to_down_excel_data(dataframe, row_name=None):
    '''
    dataframe:需要生成Excel的數(shù)據(jù),dataframe類型
    row_name:自定義Excel列名,默認(rèn)是dataframe的列名
    '''
    if row_name == None:
        row_name = list(dataframe.columns)
    sheet = dataframe.values
    sheet = sheet.tolist()
    sheet.insert(0,row_name)
    return sheet
生成下載多sheet文件,可以通過make_response_from_book_dict。
import django_excel as excel
def download_excel(request):
book_dict = {
'sheet1': [[1,2,3,4],
[3,4,5,6],
[2,4,5,6]],
'sheet2': [[7,87,9,9],
[3,5,7,8,99]]
}
file_names = '下載'
return excel.make_response_from_book_dict(book_dict,"xlsx", status=200, file_name=file_names)
其中,sheet1,sheet2為sheet名。
以上僅為筆者目前的見解,沒有寫全。如果感興趣可以直接閱讀其官方文檔:http://django.pyexcel.org/en/latest/
總結(jié)
以上是生活随笔為你收集整理的django下载excel,使用django-excel插件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: vue. 3.0使用echar
- 下一篇: 为什么大部分程序猿成为不了架构师?附架构
