zl程序教程

您现在的位置是:首页 >  工具

当前栏目

egg 实现上传excel,并解析保存到数据库

Excel数据库上传 实现 解析 保存 Egg
2023-09-11 14:15:29 时间

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>

.