Django 支持自定义表头和根据数据库某字段生成多个sheet的excel下载

工作需要,需要做下载excel的功能,同时根据数据库的某个字段完成多sheet的功能。

由于用处较多,封装了一个函数。

add_worksheet: 为生成多个sheet的方法

from io import BytesIO
import xlsxwriter

def download_excel(cursor, sql_field_index=False, custom_headers=False, sheet_title="worksheet_1"):
    """
    表格下载
    :param cursor:
    :param custom_headers: 自定义表头
    :param sql_field_index: 把该字段数据分成多个sheet
    :param sheet_title: 单 sheet表,sheet名字
    :return:
    """
    x_io = BytesIO()
    work_book = xlsxwriter.Workbook(x_io)
    worksheet_dict = dict()
    worksheet_col_row = {}
    result_data = cursor.fetchall()
    field_names = custom_headers if custom_headers else [item.name for item in cursor.description]
    if sql_field_index:
        for row in result_data:
            file_name = row[sql_field_index]
            if file_name not in worksheet_dict.keys():
                worksheet_dict[file_name] = work_book.add_worksheet(file_name)
        col = 0
        for desc in field_names:
            for current_work_sheet in worksheet_dict.keys():
                worksheet_dict[current_work_sheet].write(0, col, desc)
                worksheet_col_row[current_work_sheet] = [1, 0]
            col += 1
        for colums in result_data:
            file_value = colums[sql_field_index]
            work_sheet = worksheet_dict[file_value]
            for index in range(0, col):
                current_row, current_col = worksheet_col_row[file_value]
                work_sheet.write(current_row, current_col, colums[index])
                worksheet_col_row[file_value] = [current_row, current_col + 1]
            worksheet_col_row[file_value] = [current_row + 1, 0]
    else:
        worksheet = work_book.add_worksheet(sheet_title)
        col, row = 0, 0
        for desc in field_names:
            worksheet.write(0, col, desc)
            col += 1
        row, col = 1, 0
        for temp in result_data:
            for value in temp:
                worksheet.write(row, col, value)
                col += 1
            row += 1
            col = 0
    work_book.close()
    return x_io.getvalue()
views:
def write_excel(request):
    ......
    precur = presto.connect(‘...‘).cursor()
    # 根据explain 字段生成多个worksheet,首选获取是sql查询参数中的第几个
    sql_field_index = len(csv_hive_sql[title].split(‘explain‘)[0].split(‘,‘))
    precur.execute(sql, (now_dt,))
    custom_field_names = [csv_head_map.get(item[0]) for item in precur.description]
    result = download_excel(precur, sql_field_index, custom_field_names)
    res = HttpResponse()
    res["Content-Type"] = "application/octet-stream"
    res["Content-Disposition"] = ‘filename="userinfos.xlsx"‘
    res.write(result)
    precur.close()
    return res

根据数据库某个字段生成了3个sheet:

原文地址:https://www.cnblogs.com/donghaoblogs/p/12613193.html

时间: 2024-08-30 09:50:41

Django 支持自定义表头和根据数据库某字段生成多个sheet的excel下载的相关文章

django的模型类管理器-----------数据库操作的封装

模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句. 模型类的属性 属性objects:管理器,是Manager类型的对象,用于与数据库进行交互. 当没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects. 管理器是D

四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

Django框架,models.py模块,数据库操作--创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, oracle,postgresql数据库. 1,django默认使用sqlite的数据库,默认自带sqlite的数据库驱动   引擎名称:django.db.backends.sqlite3 在全局配置文件settings.py可以看到确认配置使用的sqlite数据库 # Database # h

Django中的app及mysql数据库篇(ORM操作)

Django常见命令 在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目.启动Django程序.创建新的APP.数据库迁移等. 创建Django项目 一把我们都新建一个文件夹来存放项目文件,切换到这个目录下,启动命令行工具.创建一个名为mysite的Django项目: django-admin startproject mysite 创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹,mysite的文件夹目录结构如下: mysite/ ma

Django的ORM映射机制与数据库实战

一.ORM(Object Relational Mapping) 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. 2.ORM由来 让我们从O/R开始.字母O起源于"对象"(Object),而R则来自于"关系&qu

MongoEngine对Django支持的官方文档翻译

官方文档地址:http://docs.mongoengine.org/django.html 博客地址:http://blog.csdn.net/gugugujiawei 6.Django支持 注意: Mongoengine已更新到支持Django1.5 6.1 连接 在setting.py文件中,忽略标准的设置,即缺省的设置(除非你想在你的工程中利用ORM模式),同时在某处module调用connect()函数. 注意: 如果你并不正在利用另一个数据库后台,你可能需要添加一个虚拟数据库后台到s

NOPI实现导入导出泛型List,支持自定义列

业务上需要自定义列的Excel的导入导出,在网上看了好多资料,很多都是有Bug而且都是支持Excel和DataTable的转换,所以自己总结了一下,应用.NET平台上的NPOI封装了支持自定义列的Excel导入导出到泛型List. 先大概说一下思路和原理,最后会附上源代码和demo供小伙伴们参考.有问题欢迎留言~ List To Excel: 参数:泛型集合数据,需要导出列名 根据提供的列名过滤集合的字段,并新建NPOI行,填充表头(应用字典类型替换数据列名为想要显示的名称)  并循环添加数据,

可以导入导出到Excel支持多表头多层显示的表格控件Essential Grid

Essential Grid for Windows Forms是一款功能强大的表格控件,很多功能和Excel表格相似,具有15种单元格类型,可以导入导出到Excel,支持多表头,多层显示,合并单元格,插入计算公式,支持LINQ,过滤和分组等. 具体功能: 支持Banner Cells,可以联合背景和邻近的单元格来显示一个背景图像或图片 支持完全自定义单元格样式 支持多个单元格覆盖合并 可以冻结行和列 表格控件支持MS Office 2003, MS Office 2007 和 Vista 样式

JAVA实现延时过期MAP 支持自定义过期触发事件

如题,直接上代码: 1 import java.util.Iterator; 2 import java.util.concurrent.ConcurrentHashMap; 3 import java.util.concurrent.TimeUnit; 4 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 8 /** 9 * 实现延时过期MAP集合 支持自定义过期触发事件 10 * 11 * @ClassName: B

Django入门--自定义过滤器与标签

为了让Django找到自定义的模板过滤器和模板标签,需要进行文件路径配置,配置方式分为APP目录下配置和项目路径下配置两种方式: 1.在APP目录下配置:针对某个应用特定的自定义 第一步:在APP目录下创建"templatetags"文件夹: 第二步:在"templatetags"文件夹下创建python模块(py文件) 2.在项目目录下配置:针对所有应用的自定义 第一步:在项目目录下创建一个新的app,例如"common"文件夹 第二步:在项目