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

起因

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

excel在线单元格拼接(模板)_第1张图片

但是使用起来,还是不够便利。于是就想着做一个在线的。我们只需要编写,字符串模板,确认占位符,并上传对应的excel,就可以生成对应的字符串。

大家可以体验下http://j2e.kpoda.com/xlsps

操作说明

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

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

  1. 上传excel

支持多个excel上传,可以选中多个,上传。

excel在线单元格拼接(模板)_第2张图片

  1. 导出excel

excel在线单元格拼接(模板)_第3张图片

excel在线单元格拼接(模板)_第4张图片

硬货

以下是主要代码

其中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

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));
        });
      }

    }

你可能感兴趣的:(excel,在线,模板,拼接,单元格拼接)