django下載excel,使用django-excel外掛

xsan發表於2018-09-30

django下載Excel,使用django-excel外掛

  由於目前的資料多是使用pandas或xlwt庫實現的。其實沒有那麼的麻煩,因為django有相對應的外掛django-excel。

  該外掛是依賴於pyexcel庫寫的。不過,不用專門安裝pyexcel庫,因為在安裝django-excel時會自動將pyexcel裝上。由於pyexcel是一個大庫,且在使用django-excel時不用考慮pyexcel的使用方法,所以就不再此介紹太多了。在此,還是要多說一句,pyexcel的功能也是很強大的,可以實現資料的視覺化,目前已開發出了與flask、django等web框架的對應外掛,比如今天介紹的django-excel。

  django-excel是一款支援上傳和下載excel檔案的外掛,並可以將excel檔案以網頁的形式展現出來,也可以將資料存入資料庫。由於,筆者也是剛接觸該外掛,而且開發需求目前僅為下載功能,所以本篇只介紹其下載的功能。(注:實現下載功能,部署的伺服器無需安裝office)

1、 安裝

  pip install django-excel

  安裝時會自動安裝pyexcel-io、pyexcel、pyexcel-webio

2、 支援django的版本

  目前已支援到django2.1.1版本。所以,使用目前django最新版的開發者也不用擔心了,因為它支援。

3、 實現下載

  該外掛支援的資料格式很多,array(二維陣列)、字典、資料庫的表(單張或多張)、django的ORM查詢結果(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(只讀)

xlrdxlwt

同上

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

同上

 

 

 

 

 

 

 

 

 

上表是生成對應檔案格式所需安裝的包。

  如果是要使用二維陣列生成excel檔案,則需return django_excel.make_response_from_array(二維陣列名, 生成的檔案型別, status=200)。二維陣列每一行代表Excel中相應的行。

  如果想要使用字典生成excel檔案,則需return django_excel.make_response_from_dict(字典名, 檔案型別, status=200)。鍵名為列名,鍵值為資料。

  如果想要使用資料庫的表(單張)生成excel檔案,則需return django_excel.make_response_from_a_table(表名, 檔案型別, status=200)

  如果想要使用資料庫的表(多張)生成excel檔案,則需return django_excel.make_response_from_tables(表名列表, 檔案型別status=200)

  如果想要使用查詢集合生成excel檔案,則需return django_excel.make_response_from_query_sets(查詢集合名, 所需列對應欄位(列表型別),檔案型別, status=200)。所需列對應欄位的列表裡的順序為Excel列名的順序,且列表裡的元素必須為model裡的變數名。

  所有函式的通用引數包含file_name 和sheet_name,分別為檔名和Excel的工作薄名。

  注意,不論是資料庫表還是查詢集合,都不能包含外來鍵否則會報錯,而且只能通過頁面的跳轉實現下載,不能通過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=`測試檔案`)

 

以上僅為筆者目前的見解,沒有寫全。如果感興趣可以直接閱讀其官方文件:http://django.pyexcel.org/en/latest/

相關文章