whole_func_string: function(data, merges) {
        var ws = {};
        var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
        var types = this.typeConfig;
        for (var R = 0; R !== data.length; ++R) {
          for (var C = 0; C !== data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            var cell = data[R][C];
            if (!cell || !cell.v) continue;
            var cell_ref = XLSX.utils.encode_cell({ c: C, r: R });
  
            if (!cell.t) {
              if (types.number.assert(cell.v)) cell.t = _TYPE.NUMBER;
              else if (types.boolean.assert(cell.v)) cell.t = _TYPE.BOOLEAN;
              else if (types.date.assert(cell.v)) cell.t = _TYPE.DATE;
              else cell.t = _TYPE.STRING;
            }
            if (cell.t === _TYPE.DATE) {
              cell.t = _TYPE.NUMBER;
              cell.z = XLSX.SSF._table[14];
              cell.v = this.dateNum(cell.v);
            }
            ws[cell_ref] = cell;
          }
        }
        ws["!merges"] = merges;
        if (range.s.c < 10000000) ws["!ref"] = XLSX.utils.encode_range(range);
        return ws;
      }
func_code_string: function(data, merges) {
        var ws = {};
        var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
        var types = this.typeConfig;
        for (var R = 0; R !== data.length; ++R) {
          for (var C = 0; C !== data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            var cell = data[R][C];
            if (!cell || !cell.v) continue;
            var cell_ref = XLSX.utils.encode_cell({ c: C, r: R });
  
            if (!cell.t) {
              if (types.number.assert(cell.v)) cell.t = _TYPE.NUMBER;
              else if (types.boolean.assert(cell.v)) cell.t = _TYPE.BOOLEAN;
              else if (types.date.assert(cell.v)) cell.t = _TYPE.DATE;
              else cell.t = _TYPE.STRING;
            }
            if (cell.t === _TYPE.DATE) {
              cell.t = _TYPE.NUMBER;
              cell.z = XLSX.SSF._table[14];
              cell.v = this.dateNum(cell.v);
            }
            ws[cell_ref] = cell;
          }
        }
        ws["!merges"] = merges;
        if (range.s.c < 10000000) ws["!ref"] = XLSX.utils.encode_range(range);
        return ws;
      }
func_documentation_string: Creates an Excel spreadsheet from a data string
  @memberof TableExport.prototype
  @param data {String}
  @param merges {Object[]}