zoukankan      html  css  js  c++  java
  • django下载excel,使用django-excel插件

    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版本

    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='测试文件')

    这是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的列名
        '''
        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/

  • 相关阅读:
    java_实现接口的枚举类
    java_枚举类枚举值
    使用abstract关键字的使用
    final在类和方法中的使用
    构造方法的作用
    final在Java中的作用
    this和super不能同时出现在构造方法中
    构造方法和全局变量的关系
    IO流
    递归列出一个目录下所有的文件夹和文件
  • 原文地址:https://www.cnblogs.com/xshan/p/9727887.html
Copyright © 2011-2022 走看看