刚开始也是在百度上找了好久,没有找到合适的,于是就自己写了一个,仅供参考。我这里分成了三层,
这里需要用到一个插件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)
}
}
}
之所以分这么多的文件夹,或许看着很麻烦,主要是每一层都有自己的逻辑需要处理,学在一起会比较乱。