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
pyexcel-xlsx需另外单独安装。否则在下载时会报:OSError: No content, file name. Nothing is given的错误。
2、 支持django的版本
目前已支持到django2.1.1版本。所以,使用目前django最新版的开发者也不用担心了,因为它支持。
3、 实现下载
该插件支持的数据格式很多,array(二维数组)、字典、数据库的表(单张或多张)、django的ORM查询结果(query sqt)等等。可以生成的文件类型:csv、tsv、csvz、tsvz、xls、xlsx、xlsm、ods。
包名 |
支持的文件格式 |
依赖 |
Python版本 |
csv, csvz , tsv, tsvz |
2.6, 2.7, 3.3, 3.4, 3.5, 3.6 pypy |
||
xls, xlsx(只读), xlsm(只读) |
同上 |
||
xlsx |
同上 |
||
ods |
pyexcel-ezodf, lxml |
2.6, 2.7, 3.3, 3.4 3.5, 3.6 |
|
ods |
同上 |
上表是生成对应文件格式所需安装的包。
如果是要使用二维数组生成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
import django_excel as excel def download_excel(request): data_excel =django_test_1.objects.all() column_names = ["abc"] return excel.make_response_from_query_sets(data_excel,column_names, "xlsx",status = 200 ,sheet_name='测试',file_name='测试文件')
这是Xsan自己编写的函数,将pandas中的dataframe数据转换成django-excel中的sheet参数
# 将dataform转换成django-excel下载是的sheet
def dataframe_to_down_excel_data(dataframe, row_name=None):
'''
dataframe:需要生成Excel的数据,dataframe类型
row_name:自定义Excel列名,默认是dataframe的列名
'''
table_data_dataframe_index = list(dataframe.index)
row_list = []
for i in table_data_dataframe_index:
tmp = dataframe.loc[i, :]
row_list.append(tmp)
if row_name == None:
row_name = list(dataframe.columns)
sheet = [row_name]
for i in row_list:
sheet.append(i)
return sheet
以上仅为笔者目前的见解,没有写全。如果感兴趣可以直接阅读其官方文档:http://django.pyexcel.org/en/latest/