也是別人寫的框架自己,自己忽然要用到,給改了下,具體框架怎麼寫的 也沒細看,會用就行 以下 我儘可能把我知道的都寫一下
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模版寫法 相當於表格裡寫變數 資料根據變數位置 遍歷迴圈
不上傳我的專案了 大家直接下載源文件 研究吧