egg 实现上传excel,并解析保存到数据库
1.安装 xlsx
yarn add xlsx --save-dev
2.创建工具类
app/controller/tools.js
'use strict';
const Controller = require('egg').Controller;
const XLSX = require('xlsx');
class ToolsController extends Controller {
async importExcel() {
const { ctx } = this;
// 获取额外参数
const { headerMap, type } = ctx.request.body;
// 获取文件对象
const file = ctx.request.files[0];
try {
// 每行数据要进行的特殊处理函数
const rowTransform = (row) => ({
...row,
// mobile: row.mobile.toString(),
});
// 将文件解析成js数据,上边封装的可复用的解析函数
const importData = ctx.helper.getImportXLSXData(file, JSON.parse(headerMap), rowTransform);
// 初步校验通过,导入数据库,返回结果
let result;
if(type === 'forum'){
result = await ctx.service.diary.import(importData)
}
ctx.success({
data: result,
message: '导入excel数据成功'
});
} catch (error) {
ctx.badRequest({
data: {},
message: '导入excel数据失败',
});
}
}
}
module.exports = ToolsController;
3.配置路由
// 上传excel文件
router.post('/tools/excel/import', jwt, controller.tools.importExcel);
4.页面调用
<Upload
name="excel"
// listType="text"
accept=".xlsx"
showUploadList={false}
action={`${BaseUrl}/tools/excel/import`}
headers={{
Authorization: `Bearer ${window.sessionStorage.getItem("x-user-token")}`
}}
data={{
headerMap: JSON.stringify({
'用户ID': 'user_id',
'标题': 'title',
'内容': 'content',
}),
type: 'forum'
}}
beforeUpload={beforeUpload}
onChange={this.handleChange}
>
<Button
type="primary"
icon="upload"
loading={loading}
>{title}</Button>
</Upload>
.

浙公网安备 33010602011771号