Vue+Django+axios+openpyxl后端python读取数据库生成excel文件前端下载(前后端代码)
python+mysql+vue实现前后端下载数据库数据到本地
·
前端代码:
<template>
<!-- 通过按钮的方式来下载文件做测试-->
<el-button plain @click="getEventDay()">数据导出</el-button>
</template>
<script>
import axios from 'axios'
export default {
data () {
return {
}
},
methods: {
// 调用的方法
async getEventDay () {
axios({
// axios访问的方式,url地址,以及response的流格式,设置为blob这一步十分重要
method: 'post',
url: 'http://127.0.0.1:8000/api/event_day/',
responseType: 'blob'
}).then(res => {
// 获取头文件中的内容为了读取后端发送文件的文件名
var disposition = res.headers['content-disposition']
var fileName = decodeURI(disposition.substring(disposition.indexOf('filename=') + 9, disposition.length))
// 创建blob流并将数据添加进去,根据不同类型文件设置不同的type,excel就设置这种type就可以了
const blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }) // 假设文件为pdf
// 创建组件并点击,地址为流地址,之后销毁掉
const link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = fileName
link.click()
link.remove()
}).catch(err => {
var enc = new TextDecoder('utf-8')
var res = enc.decode(new Uint8Array(err.data)) // 转化成json对象
console.log(res)
})
}
}
}
</script>
<style scoped>
</style>
python+django后端代码
from openpyxl import Workbook
from urllib.parse import quote
def event_day(request):
# django里面的特定调用数据库的方法
report = ReportForm.objects.all()
#创建对象
wb = Workbook()
#起文件名字
dest_filename = '日报'
#创建sheet
ws1 = wb.active
ws1.title = "dayilyCount"
#给excel的单元格填写内容
ws1.cell(1, 1, 'id')
ws1.cell(1, 2, '1234')
ws1.cell(1, 3, '事件类型')
ws1.cell(1, 4, '备注')
row = 2
col = 1
for rep in report:
ws1.cell(row, col, rep.id) //这里的字段一定要和数据表里对应
ws1.cell(row, col + 1, rep.time)
ws1.cell(row, col + 2, rep.type)
ws1.cell(row, col + 3, rep.payload)
row = row + 1
#返回内容
response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', charset='utf-8')
response['Content-Disposition'] = 'attachment; filename={0}.xlsx'.format(quote(str(dest_filename)))
response['Access-Control-Expose-Headers'] = 'Content-Disposition'
wb.save(response)
return response
数据表:model
class ReportForm(models.Model):
time=models.DateField(verbose_name='日期',auto_now_add=true)
type=models.CharField(verbose_name='类型',max_length=255)
payload=models.CharField(verbose_name='下载信息',max_length=32)
数据库数据:
导出后效果:
以上就是简单的把数据库数据导出到本地的过程,代码可以直接复制。
更多推荐
已为社区贡献1条内容
所有评论(0)