node 抓取api資料匯出為excel表格

樓云溪水發表於2018-06-19

也是別人寫的框架自己,自己忽然要用到,給改了下,具體框架怎麼寫的 也沒細看,會用就行 以下 我儘可能把我知道的都寫一下

1.先看下效果

在node環境下(實際就是安裝了node軟體) 設定環境變數 讓node在任意路徑都可以執行node命令(可以用 node -v測試)

node 抓取api資料匯出為excel表格

雙擊執行auto.bat 即可生成:

node 抓取api資料匯出為excel表格

node 抓取api資料匯出為excel表格


這個框架依賴 第一個圖的 ejs4xlx.js ejsExcel.js filter.js

auoExcel.js 是我寫的 我仔細說一下 這個

1.先引入需要模組

const ejsexcel = require("./ejsExcel");
const fs = require("fs");
const util = require("util");
const http = require('http');  
const url = require('url');
const readFileAsync = util.promisify(fs.readFile);
const writeFileAsync = util.promisify(fs.writeFile);
複製程式碼

2.獲取api資料 跟ajax獲取資料是一樣的 但是又不是ajax 因為那是瀏覽器物件 node是沒有window.ActiveXObject或者window.XMLHttpRequest物件 以下是get請求 post 也差不多

(請求地址 我就不說了 不能給)

function getdata(type,nextfn){
	var urlstr ='http://*******&type='+type.index+'';
	http.get(urlstr, (res) => {
		var data = ''; //介面資料  
		res.on('data', (chunk) => {
			data += chunk; //拼接資料塊  
		});
		res.on('end', function() {
			let redata = JSON.parse(data); //解析json 
			if(redata.msg == 'SUCCESS'){
				reflashdata(redata,type,nextfn);
			}else{
				console.log('-------------------獲取資料失敗-----------------');
			}
		})
	}).on('error', () =>
		console.log('獲取資料出錯!')
	);
}
複製程式碼

3.get到資料後,執行reflashdata(redata,type,nextfn); 對資料進行以下清洗 變成自己想要的這樣的資料格式

function reflashdata(redata,typeobj,nextfn){
	var alldata = [[{"name":typeobj.name+"價格走勢"}],[]];
	for(var i=0;i<redata.data.length;i++){
		var item={"day":"","a":"","b":"","c":"","d":"","e":""};
		item.day=new Date(redata.data[i].datetime*1000).format('MM-dd');
		item.a=parseInt(redata.data[i].history_price)+"/噸";
		...
		alldata[1].push(item);
	}
	nextfn(alldata);
}
複製程式碼

最後的資料格式是:

[[{"name":"棉花價格走勢"}],[{"day":"05-30","a":"16323/噸","b":"","c":"","d":"","e":"14786/噸"},{"day":"05-31","a":"","b":"16323/噸","c":"16323/噸","d":"16323/噸","e":"14813/噸"}]]

因為我要生成 多個excel所以for迴圈裡 執行多次獲取資料 生成excel

function autoExcelfn() {
	var arr=[{"index":2,"name":'棉花'},{"index":1,"name":'玉米'},{"index":5,"name":'大豆'},{"index":23,"name":'春小麥'},{"index":2,"name":'水稻'}];
	var nowday=(new Date()).format('yyyy-MM-dd');
	fs.mkdirSync("./../農作物價格走勢/"+nowday);
	for(var i in arr){
		//獲得Excel模板的buffer物件
		//資料來源
		(function(i){
			getdata(arr[i],function(data){
				(async function(data) {
					const exlBuf = await readFileAsync("./template1.xlsx");
					var exlBuf2 =await ejsexcel.renderExcel(exlBuf, data);
					await writeFileAsync("./../農作物價格走勢/"+nowday+"/"+arr[i].name+"價格走勢"+".xlsx", exlBuf2);
				})(data);
			});
		})(i)
	}
	console.log("生產成功!----------------------");
}
autoExcelfn();
複製程式碼

在獲取資料的方法getdata的回撥裡 把整理好的資料 data 寫到 excel,並生成excel檔案

fs.mkdirSync("./../農作物價格走勢/"+nowday); 在'./../農作物價格走勢/' 生成 ‘2018-06-14’ 資料夾

const exlBuf = await readFileAsync("./template1.xlsx");讀取模版excel

var exlBuf2 =await ejsexcel.renderExcel(exlBuf, data); 根據模版 填充資料

await writeFileAsync("./../農作物價格走勢/"+nowday+"/"+arr[i].name+"價格走勢"+".xlsx", exlBuf2); 寫入

4.excel模版寫法 相當於表格裡寫變數 資料根據變數位置 遍歷迴圈

node 抓取api資料匯出為excel表格
node 抓取api資料匯出為excel表格

不上傳我的專案了 大家直接下載源文件 研究吧

專案地址:https://gitee.com/ccteams/ejsExcel

相關文章