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()