excel在线单元格拼接(模板)

原由

咱们在工做过程当中,偶尔会有需求是把excel中的某些列,拼接起来,中间加一些其它字符。例如:从数据库中导出一个表到excel中,在excel中修改后,生成对应的更新语句,到数据库执行。通常这个时候,咱们会直接使用excel中的&进行拼接。例如:git

[外链图片转存失败(img-Z7VhO8nK-1565497124179)(2DD13D4437A749278216B8C6B45B4BB1)]

可是使用起来,仍是不够便利。因而就想着作一个在线的。咱们只须要编写,字符串模板,确认占位符,并上传对应的excel,就能够生成对应的字符串。github

你们能够体验下http://j2e.kpoda.com/xlspsweb

操做说明

  1. 输入模板
update table set name_en ='{{A}}', name_cn ='{{B}}' where id = '{{C}}';

其中{{A}},{{B}},{{C}}为占位符,对应excel中的A,B,C列。sql

  1. 上传excel

支持多个excel上传,能够选中多个,上传。数据库

[外链图片转存失败(img-BxW0A9Dy-1565497124182)(605E6736797241A2B73F8AD6D1C3B9CA)]

  1. 导出excel

[外链图片转存失败(img-HtIlxji2-1565497124183)(B688E99A33604D778053AE4F310B9475)]

在这里插入图片描述

硬货

如下是主要代码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));
        });
      }

    }