Django+vue 上传execl文件并解析
VUE
<template>
<el-button type="primary" class="but_list_but1"><input type="file" name="avatar" id="avatar" style="display: none"
@change="upload('/api/v1/admin/product/load/',$event)"><label
for="avatar">导入</label></el-button>
</template>
<script>
import axios from "axios";
import {MessageBox, Message} from 'element-ui'
import {Loading} from 'element-ui'
const http = axios.create({
// baseURL: process.env.VUE_APP_BASE_API,
baseURL: '/api',
timeout: 60000,
withCredentials: true
})
export default {
methods: {
/**
* 上传
* @param url
* @param data
*/
upload(url, file, data) {
const formData = new FormData()
formData.append('file', file.target.files[0])
// 附加数据
if (data) {
Object.keys(data).forEach(key => {
formData.append(key, data[key])
})
}
return new Promise((resolve, reject) => {
// 打开
const loading = Loading.service({
text: '正在上传数据...',
background: 'rgba(0, 0, 0, 0.7)'
})
http
.request({
url: url,
method: 'post',
data: formData,
timeout: 1200000
})
.then(response => {
console.log(response)
loading.close()
resolve(response)
}
})
.catch(err => {
loading.close()
reject(err)
})
})
},
}
}
</script>
Django
'''
首先需要安装xlrd
pip install xlrd==1.2.0
推荐安装老版本,xlrd版本原因,好像最新的版本不支持读取xlsx文件了,新版本会报错
'''
def leading_in(self, request):
'''
导入商品列表
'''
file = request.FILES.get('file')
from io import BytesIO, StringIO
sio = BytesIO()
for i in file:
sio.write(i) # 将数据写入io对象
data = xlrd.open_workbook(file_contents=sio.getvalue()) # 如果传入的是io数据对象,那么别忘了传参的时候要用关键字file_contents=指定一下
# 根据索引获取第一个sheet工作簿
sheet = data.sheet_by_index(0)
# 获取execl中的行数
rows_count = sheet.nrows
# 获取execl的列数
cols_count = sheet.ncols
# print(sheet.name, rows_count, sheet.ncols) # sheet名称,行数,列数
for i in range(1, rows_count):
# rowx表示是获取第几行的数据
# start_col表示列从索引为多少开始,end_colx表示从索引为多少结束,
# end_colx为None表示结束没有限制
# 获取指定行中的数据并以列表的形式返回
table_list = sheet.row_values(rowx=i, start_colx=0, end_colx=None)