NodeJs处理excel返回json
快3个月没写博客了,感觉好生疏。
由于最近在做一个乐队投票活动,每个乐队都有几个预览图片,但是运营上传图片的时候没有考虑顺序问题,后端也没做类似于拖拽排序的功能,为了快速改出来,乐队预览图的url格式是"http://api.juhuaba.com/api/file/z2/图片id", 然后一想,前端可以根据指定的id的顺序来显示,然后运营那边就给了我一个excel表格,每个乐队的id和图片,然后,看了一眼excel表格,好几百条数据,感觉手动处理太烦,而且容易出错,所以就想搞个办法让程序来处理。
先上一张excel的图
然后开始从网上找办法,很多都是说用一个"node-xlsx"的插件,但是我试了下,可能是excel表格的问题吧,报了个很奇怪的错,就放弃了。后来去npm上找到一个"xlsx-json"的插件,试了下,确实可以取得表格里的数据做为一个数组,每一项都有,只不过如果是空单元格或者被合并的单元格都会显示null,所以还是得自己处理下。
首先肯定是执行"npm install xlsx-json"啦
然后这个插件需要有个配置文件,暂且叫task.json吧,下面是task.json中的内容。
[
{
"input": "data.xlsx",
"sheet": "Sheet1",
"range": "A1:C240",
"raw": true,
"output": "data.json"
}
]
// 该数组接受多个对象,每个对象的基本格式是上面那种
// input代表是哪个文件
// sheet代表一个工作簿
// range代表要转换的一个区域
// row代表逐行读取
// output代表输出到哪个文件
下面是调用代码
var xlsx2json = require('xlsx-json');
xlsx2json(task, function(err, jsonArr) {
if (err) {
console.error(err);
return;
}
});
虽然配置了这些参数,但是读取出来的不如人意,就像下面这样:
然后就对转换出来数组的进行了处理,下面是完整代码,前台浏览器访问http://localhost:3000,直接返回json给前台
var xlsx2json = require('xlsx-json'), // 加载xlsx-json模块
task = require('./task.json'), // 配置文件
express = require("express"),
app = express(),
jsonData, // 临时变量,存储转转出来的数据
tmpObj = {}, // 对象,循环时用
lastTmp = {}, // 对象,循环用,存储每个乐队的完整对象
result = []; // 由完整乐队对象构成的数组
xlsx2json(task, function (err, jsonArr) {
if (err) {
console.error(err);
return;
}
jsonData = jsonArr[0];
// 返回值为[[],[],[],[]]格式,所以拿第一个
});
for (var i = 1, len = jsonData.length; i < len; i++) {
var str = jsonData[i].join("-");
jsonData[i] = str;
}
// 对转出来的数组进行遍历(从第二项,第一项是["name","id","pics"],所以不需要转换),有的前面两项是null的数组就被转换成"--第三项"了
for (var j = 1, lenj = jsonData.length; j < lenj + 1; j++) {
// 同样从第二项开始遍历,这边多循环一次由于最后一项的原因(当然也可以不多循环,直接在for外面再做个push就好)
if (j == lenj) {
result.push(lastTmp);
}
// 到最后一项时,放到数组里面(此时最后一项已经没有了)
if (jsonData[j] && !jsonData[j].match(/\-\-/g)) {
// 该项存在且不是前面两项为null的情况
if (lastTmp.hasOwnProperty("id")) {
result.push(lastTmp);
}
// 在"第二轮"循环时,把一个完整的乐队对象放到数组
tmpObj = {};
var spl = jsonData[j].split("-");
tmpObj = {
"id": spl[1],
"image": [
spl[2]
]
};
// 给tmpObj指定id和image,其中image为数组
} else if (jsonData[j] && jsonData[j].match(/\-\-/g).length) {
// 该项存在且前面两项为null的情况,就取最后一项
var tmpStr = jsonData[j].replace("--", "");
if (tmpStr) {
tmpObj.image.push(jsonData[j].replace("--", ""));
}
}
lastTmp = tmpObj;
// 把每次循环得到的乐队对象做存储
}
app.get("/", function (req, res) {
// 配置路由,请求http://localhost:3000时,输出转换好的数据
res.send(200, {
"data": result
});
});
app.listen(3000, function () {
console.log("success!");
});
最终返回的结果如下图所示: