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>
.