flask连接mysql导出excel表格在客户端提供提供下载功能

flask连接mysql导出excel表格在客户端提供提供下载功能

xlwt

​ 可以实现指定表单、指定单元格的写入。支持excel03版到excel2013版,保存的格式只支持xls格式,07以后的版本xlsx不支持。

StringIO

​ 很多时候,数据读写不一定是文件,也可以在内存中读写。StringIO顾名思义就是在内存中读写str。

要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可

BytesIO

​ StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes

flask连接mysql导出excel

from flask import Flask, make_response,render_template
import pymysql
from io import BytesIO
import xlwt

db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='test1', charset='utf8')


def db_data():
    sql = 'select * from user;'
    cc = db.cursor()  # 创建游标
    cc.execute(sql)  # 执行sql语句
    return cc.fetchall()  # 返回查到所有的数据


app = Flask(__name__)
@app.route('/')
def index():
    return render_template('user.html')

@app.route('/download')
def download_data():
    ret = db_data()
    wb = xlwt.Workbook(encoding='utf-8')  # 实例化
    ws = wb.add_sheet('res', cell_overwrite_ok=True)  # Workbook的方法,生成res.xls的文件
    row = ['id', 'name']
    for i in range(0, len(row)):
        ws.write(0, i, row[i])  # 将这些字段写入res.xls文件
    k = 1
    for i in ret:
        for j in range(len(row)):  # 在每列添加数据
            ws.write(k, j, i[j])
        k += 1

    sio = BytesIO()  # 将获取的数据在内存中写
    wb.save(sio)  # 将文件流保存
    sio.seek(0)  # 光标

    response = make_response(sio.getvalue())
    response.headers['Content-type'] = 'application/vnd.ms-excel'  # 指定返回数据类型
    response.headers['Transfer-Encoding'] = 'chunked'
    response.headers['Content-Disposition'] = 'attachment;filename=res.xls'  # 设定用户游览器保存的文件名
    return response

if __name__ == '__main__':
    app.run()
posted @ 2020-07-25 00:40  豆子V  阅读(529)  评论(0编辑  收藏  举报