NodeJs之EXCEL文件導入導出MongoDB數據庫數據


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     }

第五步:導出后的效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM