首页> 自动化运维> django 的model一键导出excel 通用...

[资源]django 的model一键导出excel 通用的程序

收藏
0 905 0

Django model导出为excel

罗成硕

【摘要】

         在某项目中,需要将djangomodel导出excel 写了个通用的函数 方便修改使用。

只需要传递queryset对象,以及其他参数  极大的简化了导出数据的方式,但需要注意这个模块限制一次写入65535行数据。

【正文】

   、安装环境

xlwt==1.3.0

 

   xlwt使用

实现的效果是导出excel


具体代码如下

import os
os
.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
import django
# 1.导出excel的库
import xlwt
# 2.实现了在内存中读写bytes
from io import BytesIO
django
.setup()
from django.apps import apps
from account.models import BkUser

def getmodelfield(appname, modelname):
   
"""返回的是某个app下的model的所有字段和中文名得字典"""
   
model_obj = apps.get_model(appname, modelname)
   
field_dic = {}
   
for field in model_obj._meta.fields:
       
field_dic[field.name] = field.verbose_name
   
return field_dic


def get_field_list(field_dict):
   
"""将字段的字典转化为字段key 和中文名的列表"""
   
key_list = []
   
value_list = []
   
for key, value in field_dict.items():
       
key_list.append(key)
       
value_list.append(value)
   
return key_list, value_list


def create_excel(app, modelname, data, save_path, sheet_name):
   
"""
   
创建excel表格
    :param app:
填写app名称
    :param modelname:
填写将要导出的model的字符串名
    :param data:
导出的model的数据queryset 例如 HostCmdbPolymericInfo.objects.all()[:10]
    :param save_path:
保存的路径
    :param sheet_name: excel
sheet名称
    :return: <xlwt.Workbook.Workbook object at 0x05B5B630>
报表对象  则代表excel已经写入到文件
    """
   
field_dict = getmodelfield(app, modelname)
   
key_list, value_list = get_field_list(field_dict)
   
# 创建一个文件对象
   
wb = xlwt.Workbook(encoding='utf8')
   
# 创建一个sheet对象
   
sheet = wb.add_sheet(sheet_name)

   
# 设置文件头的样式,这个不是必须的可以根据自己的需求进行更改
   
style_heading = xlwt.easyxf("""
            font:
                name Arial,
                colour_index white,
                bold on,
                height 0xA0;
            align:
                wrap off,
                vert center,
                horiz center;
            pattern:
                pattern solid,
                fore-colour 0x19;
            borders:
                left THIN,
                right THIN,
                top THIN,
                bottom THIN;
            """
)

   
# 写入文件标题
   
for index, key in enumerate(key_list):
       
# 也可以写入model 的中文名
       
sheet.write(0, index, key, style_heading)
   
# 写入数据
   
data_row = 1
   
for index, obj in enumerate(data):
       
# 循环每条数据  外键 目前没有拿到值 可以另行进行判断
        #
格式化datetime
        # oper_time = obj.operating_time.strftime('%Y-%m-%d')
       
for i, key in enumerate(key_list):
           
# 完成一条数据的写入
           
sheet.write(data_row, i, obj.__dict__.get(key)) # 这里也可以选择不进行转为str类型
       
data_row = data_row + 1
       
# 写出到IO
   
output = BytesIO()
   
wb.save(save_path)
   
return wb


if __name__ == '__main__':
    import
time
    t_start
= time.time()
   
data = BkUser.objects.all()
   
ret = create_excel("account", "BkUser", data, "user.xls", "数据库导出")
   
e_time = time.time()
   
print(t_start)
   
print(e_time)
   
print(e_time-t_start)
   
print(ret)

 

 

   、调用实例

实现的是浏览器下载  返回给浏览器下载


 

import requests
import json
import os
from common.log import logger
from django.shortcuts import HttpResponse

os
.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
import django
# 1.导出excel的库
import xlwt
# 2.实现了在内存中读写bytes
from io import BytesIO

django
.setup()
from django.apps import apps
from sys_cmdb.models import HostCmdbPolymericInfo
from collections import OrderedDict
 def getmodelfield(appname, modelname):
   
"""返回的是某个app下的model的所有字段得字典"""
   
modelobj = apps.get_model(appname, modelname)
   
field_dic = OrderedDict()
   
for field in modelobj._meta.fields:
       
field_dic[field.name] = field.verbose_name
       
# print('字段类型:', type(field).__name__)  # 返回的是‘charfield,'textfield',等这些类型
   
try:
       
field_dic.pop('id')
       
field_dic.pop('is_delete')
   
except Exception as e:
        pass
    return
field_dic

def get_field_list(field_dict):
   
"""将字段的字典转化为字段key 和中文名的列表"""
   
key_list = []
    
value_list = []
   
for key, value in field_dict.items():
       
key_list.append(key)
       
value_list.append(value)
   
return key_list, value_list


def write_sheet2(tps_data, sheet2, tps_key_list, tps_value_list):
   
# 设置文件头的样式,这个不是必须的可以根据自己的需求进行更改
   
style_heading = xlwt.easyxf("""
                   font:
                       name Arial,
                       colour_index white,
                       bold on,
                       height 0xA0;
                   align:
                       wrap off,
                       vert center,
                       horiz center;
                   pattern:
                       pattern solid,
                       fore-colour 0x19;
                   borders:
                       left THIN,
                       right THIN,
                       top THIN,
                       bottom THIN;
                   """
)

   
# 写入文件标题
   
for index, key in enumerate(tps_value_list):
       
# 也可以写入model 的中文名
       
if key == "service name":
            
sheet2.write(0, index, "服务名称", style_heading)
       
else:
           
sheet2.write(0, index, key, style_heading)
   
# 写入数据
   
data_row = 1
   
for index, obj in enumerate(tps_data):
       
# 循环每条数据  外键 目前没有拿到值 可以另行进行判断
        #
格式化datetime
        # oper_time = obj.operating_time.strftime('%Y-%m-%d')
       
for i, key in enumerate(tps_key_list):
           
# 完成一条数据的写入
           
if key == "create_time":
               
sheet2.write(data_row, i, str(obj.__dict__.get(key)))
           
elif key == "fk_host_info":
               
sheet2.write(data_row, i, obj.fk_host_info.cw_host_innerip)
           
# elif key in ["id", "loadavg_max", "loadavg_min", "loadavg_avg"]:
            #     sheet.write(data_row, i, obj.__dict__.get(key))
           
else:
               
sheet2.write(data_row, i, obj.__dict__.get(key))
           
# sheet2.write(data_row, i, str(obj.__dict__.get(key)))
            # else:
            #     sheet.write(data_row, i, float('%.2f' % (obj.__dict__.get(key) / 100.00)))  #
这里也可以选择不进行转为str类型
       
data_row = data_row + 1


def write_sheet1(sheet, data, value_list, key_list):
   
# 设置文件头的样式,这个不是必须的可以根据自己的需求进行更改
   
style_heading = xlwt.easyxf("""
            font:
                name Arial,
                colour_index white,
                bold on,
                height 0xA0;
            align:
                wrap off,
                vert center,
                horiz center;
            pattern:
                pattern solid,
                fore-colour 0x19;
            borders:
                left THIN,
                right THIN,
                top THIN,
                bottom THIN;
            """
)

   
# 写入文件标题
   
for index, key in enumerate(value_list):
       
# 也可以写入model 的中文名
       
sheet.write(0, index, key, style_heading)
   
# 写入数据
   
data_row = 1
   
for index, obj in enumerate(data):
       
# 循环每条数据  外键 目前没有拿到值 可以另行进行判断
        #
格式化datetime
        # oper_time = obj.operating_time.strftime('%Y-%m-%d')
       
for i, key in enumerate(key_list):
            
# 完成一条数据的写入
           
if key == "create_time":
               
sheet.write(data_row, i, str(obj.__dict__.get(key)))
           
elif key == "fk_host_info":
               
sheet.write(data_row, i, obj.fk_host_info.cw_host_innerip)
           
elif key in ["id", "loadavg_max", "loadavg_min", "loadavg_avg", "mem_used_max", "mem_used_min",
                        
"mem_used_avg"]:
               
sheet.write(data_row, i, obj.__dict__.get(key))
           
else:
               
sheet.write(data_row, i, float('%.2f' % (obj.__dict__.get(key) / 100.00)))  # 这里也可以选择不进行转为str类型
       
data_row = data_row + 1


def create_excel(app, modelname, data, save_path, sheet_name, tps_data):
   
"""
   
创建excel表格
    :param app:
填写app名称
    :param modelname:
填写将要导出的model的字符串名
    :param data:
导出的model的数据queryset 例如 HostCmdbPolymericInfo.objects.all()[:10]
    :param save_path:
保存的路径
    :param sheet_name: excel
sheet名称
    :return: <xlwt.Workbook.Workbook object at 0x05B5B630>
报表对象  则代表excel已经写入到文件
    """
    #
设置HTTPResponse的类型
   
response = HttpResponse(content_type='application/vnd.ms-excel')
   
response['Content-Disposition'] = 'attachment;filename=%s' % (save_path)  # 这里是文件名
    #####***********************
   
tps_field_dict = getmodelfield(app, "HostTamPolymericInfo")
   
tps_key_list, tps_value_list = get_field_list(tps_field_dict)
   
#####***********************
   
field_dict = getmodelfield(app, modelname)
   
key_list, value_list = get_field_list(field_dict)
   
# value_list += tps_value_list      #####***********************
    #
创建一个文件对象
   
wb = xlwt.Workbook(encoding='utf8')
   
# 创建一个sheet对象
   
sheet = wb.add_sheet(sheet_name)
   
sheet2 = wb.add_sheet("tps数据")

   
write_sheet1(sheet, data, value_list, key_list)

   
# write_sheet2(tps_data)
   
write_sheet2(tps_data, sheet2, tps_key_list, tps_value_list)
   
# 写出到IO
   
output = BytesIO()
   
wb.save(output)
   
# 重新定位到开始
   
output.seek(0)
   
response.write(output.getvalue())
   
return response

 

 

附件
【python开发】20190630--django model导出为excel .docx 311.75KB
自动化运维
最近热帖
{{item.Title}} {{item.ViewCount}}
近期热议
{{item.Title}} {{item.PostCount}}