也是别人写的框架自己,自己忽然要用到,给改了下,具体框架怎么写的 也没细看,会用就行 以下 我尽可能把我知道的都写一下
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模版写法 相当于表格里写变量 数据根据变量位置 遍历循环
不上传我的项目了 大家直接下载源文档 研究吧