node 抓取api数据导出为excel表格
也是別人寫的框架自己,自己忽然要用到,給改了下,具體框架怎么寫的 也沒細看,會用就行 以下 我盡可能把我知道的都寫一下
1.先看下效果
在node環境下(實際就是安裝了node軟件) 設置環境變量 讓node在任意路徑都可以執行node命令(可以用 node -v測試)
雙擊運行auto.bat 即可生成:這個框架依賴 第一個圖的 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模版寫法 相當于表格里寫變量 數據根據變量位置 遍歷循環
不上傳我的項目了 大家直接下載源文檔 研究吧
項目地址:https://gitee.com/ccteams/ejsExcel
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的node 抓取api数据导出为excel表格的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决mysql 1040错误Too ma
- 下一篇: 继承ViewGroup:重写onMeas