109.Django Rest获取数据数据保存Excel及下载

2020-01-13  本文已影响0人  羽天驿

一.序列化和方序列化

(1)序列化:

将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象装换为JSON字符串,这个转换过程我们称为序列化。

(2)反序列化:

将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。

以上的两种的序列化的方式在写rest api 的时候会频繁的使用这两种序列化的方式。

二.搜索引擎。

1.搜索量小:whoosh +jieba--+--jieba分词查库(倒排索引)

2.搜索量大:ElasticSearch/Solr-- +ik-analysis/smartcn/pinying i--+--分词插件(最有名的倒排索引)


倒排索引:关键----------->文章。正常的是从文章---------->键字。


三.将数据写入Excel文件中并进行下载


1.查询数据

def export_excel(requset):
    # 查询数据
    rows = ()
    agents = ()
    with connection.cursor() as cursor:
        cursor.execute(
            "select t1.agentid, name, tel, total from tb_agent t1 inner join (select agentid, count(agentid) as total from tb_agent_estate group by agentid) t2 on t1.agentid=t2.agentid")
        agents = cursor.fetchall()

2.创建Excel工作簿和工作表

# 导入到Excel中
    # 创建工作簿
    workbook = xlwt.Workbook()
    # 创建工作表
    sheet = workbook.add_sheet("经理人统计表")
    titles = ("编号", "姓名", "联系电话", "楼盘数量")
    for col, title in enumerate(titles):
        sheet.write(0, col, title)
    for row, agent in enumerate(agents):
        for col in range(4):
            sheet.write(row + 1, col, agent[col])

3.保存和更改文件名


 buffer = BytesIO() #代表内存的数据---str(不能改写)----StringIO(写这个改写)
    # 保存到本地的内存 BytesIO()--改写bytes类型的数据
    workbook.save(buffer)
    resp=HttpResponse(buffer.getvalue(),content_type="application/vnd.ms-excel")

    resp["content-disposition"]='attachment;filename="data.xls"' #更改相应的头---如何处置文件
    return resp

4.完整的代码:

def export_excel(requset):
    # 查询数据
    rows = ()
    agents = ()
    with connection.cursor() as cursor:
        cursor.execute(
            "select t1.agentid, name, tel, total from tb_agent t1 inner join (select agentid, count(agentid) as total from tb_agent_estate group by agentid) t2 on t1.agentid=t2.agentid")
        agents = cursor.fetchall()
    # 导入到Excel中
    # 创建工作簿
    workbook = xlwt.Workbook()
    # 创建工作表
    sheet = workbook.add_sheet("经理人统计表")
    titles = ("编号", "姓名", "联系电话", "楼盘数量")
    for col, title in enumerate(titles):
        sheet.write(0, col, title)
    for row, agent in enumerate(agents):
        for col in range(4):
            sheet.write(row + 1, col, agent[col])
    buffer = BytesIO()  # 代表内存的数据---str(不能改写)----StringIO(写这个改写)
    # 保存到本地的内存 BytesIO()--改写bytes类型的数据
    workbook.save(buffer)
    resp = HttpResponse(buffer.getvalue(), content_type="application/vnd.ms-excel")

    resp["content-disposition"] = 'attachment;filename="data.xls"'  # 更改相应的头---如何处置文件
    return resp
    # 打开直接inline  下载就是attachment
    # 用中文对文件命名必须使用百分号进行编码

对于其中需要特殊说明的地方进行说明:

1.创建工作簿和表


创建Excel步骤.jpg

2.文件的类型:content_type="application/vnd.ms-excel"

3.resp["content-disposition"] = 'attachment;filename="data.xls"'---相应的头---如何处置文件。
4.打开直接inline 下载就是attachment
5.用中文对文件进行命名的时候需要用百分号进行编码:
导入

from urllib.parse import quote
文件名是中文的处理.png

四.BytesIO()和StringIO

说明:很多时候,数据读写不一定是文件,也可以在内存中读写,这时候就可以用到这两个。
1.BytesIO()
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可,getvalue()方法用于获得写入后的str。


>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!

2.StringIO
写入的不是str,而是经过UTF-8编码的bytes。
和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取


>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'
上一篇下一篇

猜你喜欢

热点阅读