NodeJs之EXCEL文件導入導出MongoDB數據庫數據
一,介紹與需求
1.1,介紹
(1),node-xlsx : 基於Node.js解析excel文件數據及生成excel文件。
(2),excel-export : 基於Node.js將數據生成導出excel文件,生成文件格式為xlsx(可以指定),可以設置單元格寬度,API容易上手,無法生成worksheet字表,比較單一,基本功能可以基本滿足;
1.2,需求
快速插入數據導數據庫,備份數據等
二,導入導出
2.1,數據導入
第一步:安裝node-xlsx
1 cnpm install node-xlsx --save
第二步:引入node-xlsx
1 //引入node-xlsx解析excel模塊 2 var node_xlsx = require('node-xlsx');
第三步:解析導入的excel
1 let obj = node_xlsx.parse(excelConfig.excel_Dir);// 支持的excel文件類有.xlsx .xls .xlsm .xltx .xltm .xlsb .xlam等 2 let excelObj = obj[0].data;//取得第一個excel表的數據 3 let insertData = [];//存放數據 4 5 //循環遍歷表每一行的數據 6 for(var i=1;i<excelObj.length;i++){ 7 var rdata = excelObj[i]; 8 var CityObj =new Object(); 9 // ["id" : "101010100","provinceZh" : "北京","leaderZh" : "北京","cityZh" : "北京","cityEn" : "beijing"] 10 for(var j=0;j<rdata.length;j++){ 11 CityObj[excelConfig.CityArray[j]]=rdata[j] 12 } 13 insertData.push(CityObj) 14 }
第四步:刪除已解析的excel文件
1 var fs = require('fs'); 2 ... 3 4 //導入解析成功后 將文件刪除 5 fs.unlink(excelConfig.excel_Dir,function (err) { 6 if(err) throw err; 7 console.log("刪除文件"+excelConfig.excel_Dir+"成功") 8 }) 9 10 ...
第五步:存入MongoDB數據庫
1 var MongoDbAction = require('../services/db_mongodb.js'); 2 3 ... 4 5 //將每一行的數據存進MongoDB數據庫中 6 MongoDbAction.insertMany(excelConfig.TableName, insertData, function (err, result) { 7 if (!err) { 8 res.status(200).json({ 9 httpCode: 200, 10 message: '導入成功', 11 data:{ 12 insertTotal:result&&result.n?result.n:result.length 13 }, 14 returnValue: 1 15 }); 16 } else { 17 res.status(200).json({ 18 httpCode: 200, 19 message: '導入失敗', 20 data: err, 21 returnValue: 0 22 }); 23 } 24 }); 25 26 ...

第六步:拋出接口
1 var path = require("path"); 2 var fs = require('fs'); 3 var express = require("express"); 4 5 ... 6 7 //先包含進來 8 var nodeImportExcel = require('../services/node_import_excel.js'); 9 10 11 var router = express.Router(); 12 13 ... 14 15 router.post('/tolead/excel', upload.single('file'), function (req, res, next) { 16 var fileName = req.file.filename; 17 let splitFileName = fileName.split('.'); 18 let ExcelType = splitFileName[splitFileName.length-1];// 支持的excel文件類有.xlsx .xls .xlsm .xltx .xltm .xlsb .xlam等 19 if(ExcelType!='xlsx'&&ExcelType!='xls'&&ExcelType!='xlsm'&&ExcelType!='xltx'&&ExcelType!='xltm'&&ExcelType!='xlsb'&&ExcelType!='xlam'){ 20 res.status(200).json({ 21 httpCode: 200, 22 message: '文件類型錯誤,請上傳Excel文件!', 23 data: {}, 24 returnValue: 0 25 }); 26 return; 27 } 28 29 ... 30 31 //定義實體類數組 32 let TableName = 'Test' 33 let CityArray = new Array('id', 'provinceZh', 'leaderZh', 'cityZh', 'cityEn'); 34 let importConfig = { 35 excel_Dir, 36 CityArray, 37 TableName 38 } 39 40 .... 41 42 nodeImportExcel.parseExcel(importConfig,res) 43 44 .... 45 46 }); 47 48 module.exports = router;
第七步:調用效果
(1),成功

(2),失敗 類型不對

2.2,數據導出
第一步:安裝excel-export
1 cnpm install excel-export --save
第二步:引入excel-export
1 var nodeExcel = require("excel-export");//首先,引入excel模塊:
第三步:實現導出接口拋出
1 var nodeExcel = require("excel-export");//首先,引入excel模塊: 2 var express = require('express'); 3 var router = express.Router(); 4 var moment = require('moment');//時間格式化 5 // import moment from 'moment'; 6 //先包含進來 7 var MongoDbAction = require('../services/db_mongodb.js'); 8 9 router.get('/download/excel', function (req, res) { 10 var conf = {};//創建一個寫入格式map,其中cols(表頭),rows(每一行的數據); 11 var cols = ['城市編碼', '所屬省份', '所屬市', '城市名稱', '城市英文名稱'];//手動創建表頭中的內容 12 conf.cols = [];//在conf中添加cols 13 14 for (var i = 0; i < cols.length; i++) { 15 var tits = {};//創建表頭數據所對應的類型,其中包括 caption內容 type類型 16 tits.caption = cols[i];//添加內容 17 tits.type = 'string';//添加對應類型,這類型對應數據庫中的類型,入number,data但一般導出的都是轉換為string類型的 18 conf.cols.push(tits);//將每一個表頭加入cols中 19 } 20 let fields = { 21 id: '', 22 provinceZh: '', 23 leaderZh: '', 24 cityZh: '', 25 cityEn: '' 26 } 27 MongoDbAction.getFieldsByConditions('AllCity', {}, fields, function (err, data) {//根據需求查詢想要的字段 28 if (err) { 29 //執行出錯 30 } else { 31 var tows = ['id', 'provinceZh', 'leaderZh', 'cityZh', 'cityEn'];//創建一個和表頭對應且名稱與數據庫字段對應數據,便於循環取出數據 32 var datas = [];//用於承載數據庫中的數據 33 let towsLen = tows.length 34 let dataLen = data.length 35 for (var i = 0; i < dataLen; i++) {//循環數據庫得到的數據,因為取出的數據格式為 36 //[{"id" : "101010100","provinceZh" : "北京","leaderZh" : "北京","cityZh" : "北京","cityEn" : "beijing"},{…………},{…………}] 37 let row = [];//用來裝載每次得到的數據 38 for (let j = 0; j < towsLen; j++) {//內循環取出每個 39 row.push(data[i][tows[j]].toString());//row.push((data[i].tows[j]).toString());兩種形式都是相同的 40 } 41 datas.push(row);//將每一個{ }中的數據添加到承載中 42 } 43 conf.rows = datas;//將所有行加入rows中 44 var result = nodeExcel.execute(conf);//將所有數據寫入nodeExcel中 45 res.setHeader('Content-Type', 'application/vnd.openxmlformats');//設置響應頭 46 //設置下載文件命名 支持的excel文件類有.xlsx .xls .xlsm .xltx .xltm .xlsb .xlam等 47 res.setHeader("Content-Disposition", "attachment; filename=city"+moment(new Date().getTime()).format('YYYYMMDDhhmmss')+".xlsx"); 48 res.end(result, 'binary');//將文件內容傳入 49 } 50 }); 51 }); 52 module.exports = router;
第四步:前端調用
1 downloadExcelOper() { 2 var url = "http://localhost:8000/api/v1/yingqi/download/excel"; 3 window.location = url;//這里不能使用get方法跳轉,否則下載不成功 4 5 }
第五步:導出后的效果

