起因
我们在工作过程中,偶尔会有需求是把excel中的某些列,拼接起来,中间加一些其它字符。例如:从数据库中导出一个表到excel中,在excel中修改后,生成对应的更新语句,到数据库执行。一般这个时候,我们会直接使用excel中的&进行拼接。例如:
但是使用起来,还是不够便利。于是就想着做一个在线的。我们只需要编写,字符串模板,确认占位符,并上传对应的excel,就可以生成对应的字符串。
大家可以体验下http://j2e.kpoda.com/xlsps
操作说明
- 输入模板
update table set name_en ='{{A}}', name_cn ='{{B}}' where id = '{{C}}';
其中{{A}},{{B}},{{C}}为占位符,对应excel中的A,B,C列。
- 上传excel
支持多个excel上传,可以选中多个,上传。
- 导出excel
硬货
以下是主要代码
其中XLSX 对象,使用的是第三方组件。对应的github地址为:https://github.com/SheetJS/js-xlsx/
vm.error ="";
type = type ? type : "xls";
if (vm.xlsFiles && vm.xlsFiles.length > 0) {
for (var i = 0; i < vm.xlsFiles.length; i++) {
var f = vm.xlsFiles[i];
var reader = new FileReader();
var wb;//读取完成的数据
var rABS = false; //是否将文件读取为二进制字符串
reader.onload = function (e) {
var fileName = this.fileName;
var data = e.target.result;
if(rABS) {
wb = XLSX.read(btoa(fixdata(data)), {//手动转化
type: 'base64'
});
} else {
wb = XLSX.read(data, {
type: 'binary'
});
}
//wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
//wb.Sheets[Sheet名]获取第一个Sheet的数据
$scope.$apply(function () {
//原excel对象
var oldExcelJson = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {header:"A"}) ;
//获取新的excel对象
var nExcelJson = transfer(oldExcelJson);
//输出excel
var excel = jsonService.exportJson2Excel(nExcelJson, type,fileName);
//下载excel
document.body.appendChild(excel);
excel.click();
document.body.removeChild(excel);
});
};
reader.onerror = function(stuff) {
console.log("error", stuff)
console.log (stuff.getMessage())
}
if(rABS) {
reader.readAsArrayBuffer(f);
} else {
reader.readAsBinaryString(f);
} }
} else {
vm.error = "EXCEL 数据是必填的。";
}
transfer方法根据对应的模板,变化json的结构。这里的template对象,用到了第三方组件。对应的github地址为:http://aui.github.com/art-template/
function transfer(oldExcelJson){
var tmp = vm.xlsp.tmp;
var render = template.compile(tmp);
var newExcelJson = [];
for(var i=0;i<oldExcelJson.length;i++){
var sql = render(oldExcelJson[i]);
newExcelJson[i]={"sql":sql};
}
return newExcelJson;
}
jsonService.exportJson2Excel方法用于把整理好的json,转换为DataURI,输出excel。
function exportJson2Excel(json, type,fileName) {
var log = {"type": "json2excel"};
//title
try {
var title = new Set();
for (var i = 0; i < json.length; i++) {
var r = json[i];
getProFromObject(r, title);
}
console.log("title", title);
var data = [];
for (var i = 0; i < json.length; i++) {
var r = json[i];
if(!r){
continue;
}
var dataRow = [];
title.forEach(function (t) {
var d1 = r[t];
var ss = t.split(".");
if (ss.length >= 2) {
var tmp = r;
for (var i = 0; i < ss.length; i++) {
var s = ss[i];
tmp = tmp[s];
if (!tmp) {
break;
}
}
d1 = tmp;
}
if (d1) {
if (typeof d1 == 'object') {
dataRow.push(JSON.stringify(d1));
} else {
dataRow.push(d1);
}
} else {
dataRow.push("");
}
});
data.push(dataRow);
}
console.log("data", data);
if(!fileName){
fileName = 'Report';
}
return jsonToExcelConvertor(data, fileName, Array.from(title), type);
} catch (err) {
console.error(err);
alert("导出报错:" + err.stack);
log.error = err.stack;
log.json = json;
} finally {
OplogsService.save(log).$promise.then(function (res) {
console.log(res);
}).catch(function (error) {
console.log(error);
alert("系统错误:" + JSON.stringify(error));
});
}
}