咱们在工做过程当中,偶尔会有需求是把excel中的某些列,拼接起来,中间加一些其它字符。例如:从数据库中导出一个表到excel中,在excel中修改后,生成对应的更新语句,到数据库执行。通常这个时候,咱们会直接使用excel中的&进行拼接。例如:git
可是使用起来,仍是不够便利。因而就想着作一个在线的。咱们只须要编写,字符串模板,确认占位符,并上传对应的excel,就能够生成对应的字符串。github
你们能够体验下http://j2e.kpoda.com/xlspsweb
update table set name_en ='{{A}}', name_cn ='{{B}}' where id = '{{C}}';
其中{{A}},{{B}},{{C}}为占位符,对应excel中的A,B,C列。sql
支持多个excel上传,能够选中多个,上传。数据库
如下是主要代码json
其中XLSX 对象,使用的是第三方组件。对应的github地址为:https://github.com/SheetJS/js-xlsx/promise
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/app
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。svg
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)); }); } }