node上传Excel文件到MongoDB

刚开始也是在百度上找了好久,没有找到合适的,于是就自己写了一个,仅供参考。我这里分成了三层,

这里需要用到一个插件node-xlsx

1.routes文件里面:xxx.js

var fs = require('fs');
var node_xlsx = require('node-xlsx');
var express = require('express');
var multer = require('multer')
var fileName = '';
var fileNames = '';
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, `public/images/excel`)//储存到指定的文件目录,没有的创建一个,我这里就随便写了一个
    },
    filename: function (req, file, callback) {
        fileName = `${Date.now()}.xlsx`
        callback(null, fileName);
        fileNames = fileName
    }
})
var upload = multer({
    storage: storage
})

var router = express.Router();
const {leadphon1} = require("../service/phone1Servic")//引入service文件夹里面的对应文件,也就是第二层


router.post('/tolead/excel', upload.single('file'), async function (req, res, next) {
    var fileName = req.file.filename;
    let splitFileName = fileName.split('.');
    let ExcelType = splitFileName[splitFileName.length - 1]; // 支持的excel文件类有.xlsx .xls .xlsm .xltx .xltm .xlsb .xlam等
    if (ExcelType != 'xlsx' && ExcelType != 'xls' && ExcelType != 'xlsm' && ExcelType != 'xltx' && ExcelType != 'xltm' && ExcelType != 'xlsb' && ExcelType != 'xlam') {
        res.status(200).json({
            httpCode: 200,
            message: '文件类型错误,请上传Excel文件!',
            data: {},
            returnValue: 0
        });
        return;
    }
    //定义实体类数组
    let CityArray = new Array('id','provinceZh','leaderZh','cityZh');
    let excel_Dir = "./public/images/excel/" + fileNames//这里拿到刚刚存入的文件(fileNames是存入的文件名称)
    let obj = node_xlsx.parse(excel_Dir); // 支持的excel文件类有.xlsx .xls .xlsm .xltx .xltm .xlsb .xlam等
    let excelObj = obj[0].data; //取得第一个excel表的数据
    let insertData = []; //存放数据
    //循环遍历表每一行的数据
    for (var i = 1; i < excelObj.length; i++) {
        var rdata = excelObj[i];
        var CityObj = new Object();
        // ["id" : "101010100","provinceZh" : "北京","leaderZh" : "北京","cityZh" : "北京","cityEn" : "beijing"]
        for (var j = 0; j < rdata.length; j++) {
            CityObj[CityArray[j]] = rdata[j]//这里是将拿到的数据按照刚才定义的CityArray格式
        }
        insertData.push(CityObj)
    }
    //我这一步是将空的对象列表给删除了(有可能导入的表格最后会有又空的列表)
    for (let i =insertData.length-1 ; i >= 0; i--) {
        if (JSON.stringify(insertData[i])=='{}') {
            insertData.splice(i, 1)
        }
    }
    //这里是将解析过后的文件删除了
    fs.unlink(excel_Dir,function (err) {
        if(err) throw err;
        // console.log("删除文件"+excel_Dir+"成功")
    })
    //将前面组合好的传到第二层
    res.send(await leadphon1(insertData))
})

2.service文件夹:xxx.js

const {leadphon1} =require ("../dao/phone1Dao")//引入第三层


module.exports.leadphon1=async params=>{
    const data = await leadphon1(params)
    if (data.length>0) {//如果上传成功这里返回的是一个数组,所以用length判断
        return{
            message: '列表新增成功',
            code: 1,
        }
    }
    return{
        message: '列表新增失败',
        code: 0,
    }
}

3.dao文件夹 xxxDao.js

const {phone1Model} =require("./models/phone1Models")//引入数据库模块

//
module.exports.leadphon1=async params=>{
    return await phone1Model.create(params)
}

4.dao里面的models文件夹xxx.js(这里就是数据库模块)

const { Schema, model } = require('mongoose');
const phone1Schema = new Schema({
    id:String,
    provinceZh:String,
    leaderZh:String,
    cityZh:String,
    cityEn:String,
}, { versionKey: false })
module.exports.phone1Model=model('phone1Model',phone1Schema,"phone1")

5.连接数据的我是在app.js里面引入的

// 通过 mongoose 去连接 MongoDB
const mongoose = require('mongoose');
// 设置要连接的 MongoDB 服务器地址(listManage:要连接的数据库名称)
const dbURI = 'mongodb://127.0.0.1:27017/listManage';
// 连接数据库
mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.connection.on('connected', () => console.log(dbURI + ' 数据库连接成功'));

如果上传的表格里面有时间的话可能会出现问题

这里需要转换一下

只需要在第一层下面的位置添加一行代码

//在循环删除空列表里面添加else后的代码就好
for (let i =insertData.length-1 ; i >= 0; i--) {
        if (JSON.stringify(insertData[i])=='{}') {
            insertData.splice(i, 1)
        }else{
            if (insertData[i].registrationtime!=undefined) {
                insertData[i].registrationtime = new Date(1900, 0, insertData[i].registrationtime-1)
            }
        }
    }

之所以分这么多的文件夹,或许看着很麻烦,主要是每一层都有自己的逻辑需要处理,学在一起会比较乱。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值