近期使用nodejs以及相关组件实现了excel上传解析并下载功能。可参考:https://github.com/sun-zy/excel-import-export
一. excel上传
1. 前端代码:
excel上传:
导入转写文档:<input type="file" accept=".xls,.xlsx" name="files" @change="readExcel($event)">
// 上传文件
readExcel(this: any,e: any): any { //表格导入
let that = this,
files = e.target.files;
if(!files.length) { //如果没有文件名
return false;
}else if(!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())){
alert('上传格式不正确,请上传xls或者xlsx格式');
return false;
}
let formData = new FormData();
formData.append("files", files[0]);
//(这里是自己封装的axios代码,网上有很多案例可供参考)
that.$http("/importExcel",'postFile',formData,'上传常').then(function(response:any){
if(response.code === 0){
}
},function(error:any){
console.log(222,error)
})
}
接口上传这样,即可说明上传的文件无误:
2.后端代码:
class ImportExcelController extends Controller {
async index() {
let { ctx,app } = this,
//用于接收前端上传的文件(文件流形式:fileStream)
file = ctx.multipart(),
part = await file();
// 删除原有excel文件(这里是单文件上传,接收上传文件之前删除原有文件,可根据自己需要而定)
fs.unlink('./文件.xlsx', (err) => {
if (err) throw err;
console.log('文件已删除');
});
// 文件流转buffer,并存取(这里借用了stream-to-array 插件,将文件流转buffe)
const bufferData = await toArray(part).then(function (parts) {
const buffers = []
for (let i = 0, l = parts.length; i < l; ++i) {
const part = parts[i]
buffers.push((part instanceof Buffer) ? part : new Buffer(part))
}
return Buffer.concat(buffers)
})
// 读取excel数据(这里借用了xlsx 插件,将表格数据转为json;以及exceljs插件,可参考:https://github.com/exceljs/exceljs/blob/HEAD/README_zh.md)
let wb = XLSX.read(bufferData , {type:'buffer'}),
excelData = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]),
workbook = new Excel.Workbook(),
worksheet = workbook.addWorksheet('worksheet');
// 定义excel列
worksheet.columns = [
{ header: '名称', key: 'name', width: 20 },
{ header: '性别', key: 'sex', width: 10 }
];
// 根据需求 做出对应excel的变更
excelData.forEach((item,index) => {
let key = Object.keys(item),
name = excelData[index][key];
// 添加数据
worksheet.addRow({name, sex}).commit();
})
// 生成excel文件
await workbook.xlsx.writeFile('./文件.xlsx')
}
}
module.exports = ImportExcelController;
二. excel下载
1.前端代码:
<span @click="exportExcel">下载</span>
exportExcel(this:any){
//采用get请求,前端直接下载即可
let that = this,
url = window.location.protocol + '//' + window.location.host;
window.location.href = url + '/exportExcel';
}
2.后端代码:
class ExportController extends Controller {
async index() {
let { ctx,app } = this;
// 格式必须,否则前端下载解析不出来excel格式
ctx.attachment(`文件.xlsx`)
ctx.set('Content-Type', 'text/xml');
ctx.body = fs.readFileSync('./文件.xlsx');
}
}
module.exports = ExportController;
大致就是这样,过程比较复杂,欢迎指出意见与错误~~~