原创首发    
 NodeJs + multer+ node-xlsx实现excel导入mysql

项目说明
本次项目需要批量导入数据到数据库,导出数据库生成excel,话不多说,这里就介绍怎么使用excel模板导入数据到数据库
项目安装插件
安装node-xlsx插件,这是一款支持的excel文件类有.xlsx .xls .xlsm .xltx .xltm .xlsb .xlam等插件,基本满足需求 插件的github地址
npm install node-xlsx --save
安装multer,multer是一个node.js中间件,用于处理 multipart/form-data类型的表单数据,主要用于上传文件,在form表单上要加上 enctype=“multipart/form-data” 的属性。Multer 不会处理任何非 multipart/form-data 类型的表单数据。不要将 Multer 作为全局中间件使用,因为恶意用户可以上传文件到一个你没有预料到的路由,应该只在你需要处理上传文件的路由上使用。
npm install --save multer
目录结构说明

UserMode模块
这里其实就是sequelize实例化mysql,不用直接操作mysql,完成映射关系
// 用户模块
const {
    DataTypes
} = require("sequelize");
// 导入数据库连接方法,实例化Sequelize
const sequelizedb = require('../config/db')
// 返回一个用户模型架构
const UserModel = sequelizedb.define('tb_user', {
    // 在这里定义模型属性
    // id
    id: {
        type: DataTypes.STRING,
        // 主键
        primaryKey: true,
        // 约束不为空
        allowNull: false
    },
    // 用户名
    user_name: {
        type: DataTypes.STRING
    },
    // 性别
    sex: {
        type: DataTypes.STRING
    },
    // 密码
    password: {
        type: DataTypes.STRING
    },
    // 角色,默认为普通用户,role_normal,role_admin为管理员
    roles: {
        type: DataTypes.STRING,
        defaultValue: 'role_normal'
    },
    // 创建时间
    create_time: {
        type: DataTypes.DATEONLY,
        defaultValue: Date.now
    },
    // 更新时间
    update_time: {
        type: DataTypes.DATEONLY,
        defaultValue: Date.now
    }
}, {
});
// 向外暴露UserModel
module.exports = UserModel;
excel.js路由文件
这里基本上代码都注释了,不用过多说明
// 处理excel导入,导出
const express = require('express');
const path = require('path')
const fs = require('fs')
const xlsx = require("node-xlsx");
const multer = require('multer')
const router = express.Router();
// 处理excel文件
const upload = multer({
    dest: "../public/upload"
});
// 定义全局数组
const excelHead = [
    "id",
    "user_name",
    "sex",
    "password",
    "roles"
];
// 导入暴露的模型
const UserModel = require('../models/UserModel')
const excelUtils = require('../utils/excelUtils')
/**
 * 1. 点击下载excel模板,生成blob流给前端
 * 2. excel模板输入信息后导入,解析数据(先存到服务器,服务器改名后node-xlsx读取,添加到数据库)存入数据库,存入成功给前端状态,前端重新调用init
 * 3. 前端批量导出,传递过来ids,我们利用ids查询,然后生成数据,blob流返回给前端
 */
router.get("/export", (req, res) => {
    const excelData = [{
        name: "用户模板.xlsx", // 给第一个sheet指名字
        data: [
            [
                "学号",
                "姓名",
                "性别",
                "密码",
                "类型"
            ],
        ],
    }, ];
    const optionArr = {
        "!cols": [{
                wch: 10
            },
            {
                wch: 10
            },
            {
                wch: 10
            },
            {
                wch: 10
            },
            {
                wch: 10
            }
        ],
    };
    res.send(xlsx.build(excelData, optionArr));
});
// excel导入文件,得先存下才能获取到具体内容
router.post('/upload', upload.single('file'), (req, res, next) => {
    try {
        // 重命名文件夹
        fs.rename(
            req.file.path,
            req.file.destination + "/" + "用户模板.xlsx",
            (err) => {
                if (err) {
                    console.log(err);
                }
            }
        )
        // 解析模板,返回对象形式的键值对
        const excelObj = xlsx.parse("../public/upload/用户模板.xlsx")
        console.log(`excelObj`, excelObj[0].data)
        const dataArr = excelObj[0].data;
        // 判断是不是使用的指定模板导入的
        if (excelObj[0].data[0].toString() === "学号,姓名,性别,密码,类型") {
            // 删除二位数组第一项,也就是表头数据
            dataArr.shift()
            // 遍历
            dataArr.map((item) => {
                const addData = {}
                excelHead.map((key, index) => {
                    addData[key] = item[index] ? item[index] : ''
                })
                console.log(`addData`, addData)
                // 使用模板插入数据
                UserModel.create(
                    addData
                ).then(user => {
                    if (user) {
                        return res.send({
                            status: 200,
                            msg: '成功导入excel到数据库.'
                        })
                    }
                }).catch(err => {
                    res.send({
                        status: 201,
                        msg: '模板匹配错误,请检查关键字.'
                    })
                    next(err)
                })
            })
        } else {
            // 不是的话,返回给前端错误状态
            return res.send({
                status: 201,
                msg: '模板匹配错误,请检查关键字.'
            })
        }
    } catch (error) {
        console.error('导入异常.', error)
        res.send({
            status: 201,
            msg: '导入异常, 请重新尝试'
        })
    }
})
module.exports = router;
app.js配置路由
这里只是省略的代码
const express = require('express');
...
// 引入模板文件
const excelRouter = require('./routes/excel');
// 接口的配置
app.use('/excel', excelRouter);
...
excel模板导入数据到mysql接口请求
http://localhost:5000/excel/upload
模拟请求  首先使用excel模板添加一些数据
 首先使用excel模板添加一些数据  然后接口请求
 然后接口请求  接下来我们查看数据库是否有数据,如果数据插入成功,那么怎么我们这个就可以了。到此我们的excel模板导入数据库就成功了。
 接下来我们查看数据库是否有数据,如果数据插入成功,那么怎么我们这个就可以了。到此我们的excel模板导入数据库就成功了。 






























