You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							478 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
	
	
							478 lines
						
					
					
						
							12 KiB
						
					
					
				'use strict';
 | 
						|
 | 
						|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 | 
						|
 | 
						|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
 | 
						|
 | 
						|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
 | 
						|
 | 
						|
var _ = require('../utils/under-dash');
 | 
						|
 | 
						|
var Enums = require('./enums');
 | 
						|
 | 
						|
var colCache = require('../utils/col-cache');
 | 
						|
 | 
						|
var Cell = require('./cell');
 | 
						|
 | 
						|
var Row = /*#__PURE__*/function () {
 | 
						|
  function Row(worksheet, number) {
 | 
						|
    _classCallCheck(this, Row);
 | 
						|
 | 
						|
    this._worksheet = worksheet;
 | 
						|
    this._number = number;
 | 
						|
    this._cells = [];
 | 
						|
    this.style = {};
 | 
						|
    this.outlineLevel = 0;
 | 
						|
  } // return the row number
 | 
						|
 | 
						|
 | 
						|
  _createClass(Row, [{
 | 
						|
    key: "commit",
 | 
						|
    // Inform Streaming Writer that this row (and all rows before it) are complete
 | 
						|
    // and ready to write. Has no effect on Worksheet document
 | 
						|
    value: function commit() {
 | 
						|
      this._worksheet._commitRow(this); // eslint-disable-line no-underscore-dangle
 | 
						|
 | 
						|
    } // helps GC by breaking cyclic references
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "destroy",
 | 
						|
    value: function destroy() {
 | 
						|
      delete this._worksheet;
 | 
						|
      delete this._cells;
 | 
						|
      delete this.style;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "findCell",
 | 
						|
    value: function findCell(colNumber) {
 | 
						|
      return this._cells[colNumber - 1];
 | 
						|
    } // given {address, row, col}, find or create new cell
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "getCellEx",
 | 
						|
    value: function getCellEx(address) {
 | 
						|
      var cell = this._cells[address.col - 1];
 | 
						|
 | 
						|
      if (!cell) {
 | 
						|
        var column = this._worksheet.getColumn(address.col);
 | 
						|
 | 
						|
        cell = new Cell(this, column, address.address);
 | 
						|
        this._cells[address.col - 1] = cell;
 | 
						|
      }
 | 
						|
 | 
						|
      return cell;
 | 
						|
    } // get cell by key, letter or column number
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "getCell",
 | 
						|
    value: function getCell(col) {
 | 
						|
      if (typeof col === 'string') {
 | 
						|
        // is it a key?
 | 
						|
        var column = this._worksheet.getColumnKey(col);
 | 
						|
 | 
						|
        if (column) {
 | 
						|
          col = column.number;
 | 
						|
        } else {
 | 
						|
          col = colCache.l2n(col);
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      return this._cells[col - 1] || this.getCellEx({
 | 
						|
        address: colCache.encodeAddress(this._number, col),
 | 
						|
        row: this._number,
 | 
						|
        col: col
 | 
						|
      });
 | 
						|
    } // remove cell(s) and shift all higher cells down by count
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "splice",
 | 
						|
    value: function splice(start, count) {
 | 
						|
      var nKeep = start + count;
 | 
						|
 | 
						|
      for (var _len = arguments.length, inserts = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
 | 
						|
        inserts[_key - 2] = arguments[_key];
 | 
						|
      }
 | 
						|
 | 
						|
      var nExpand = inserts.length - count;
 | 
						|
      var nEnd = this._cells.length;
 | 
						|
      var i;
 | 
						|
      var cSrc;
 | 
						|
      var cDst;
 | 
						|
 | 
						|
      if (nExpand < 0) {
 | 
						|
        // remove cells
 | 
						|
        for (i = start + inserts.length; i <= nEnd; i++) {
 | 
						|
          cDst = this._cells[i - 1];
 | 
						|
          cSrc = this._cells[i - nExpand - 1];
 | 
						|
 | 
						|
          if (cSrc) {
 | 
						|
            cDst = this.getCell(i);
 | 
						|
            cDst.value = cSrc.value;
 | 
						|
            cDst.style = cSrc.style; // eslint-disable-next-line no-underscore-dangle
 | 
						|
 | 
						|
            cDst._comment = cSrc._comment;
 | 
						|
          } else if (cDst) {
 | 
						|
            cDst.value = null;
 | 
						|
            cDst.style = {}; // eslint-disable-next-line no-underscore-dangle
 | 
						|
 | 
						|
            cDst._comment = undefined;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      } else if (nExpand > 0) {
 | 
						|
        // insert new cells
 | 
						|
        for (i = nEnd; i >= nKeep; i--) {
 | 
						|
          cSrc = this._cells[i - 1];
 | 
						|
 | 
						|
          if (cSrc) {
 | 
						|
            cDst = this.getCell(i + nExpand);
 | 
						|
            cDst.value = cSrc.value;
 | 
						|
            cDst.style = cSrc.style; // eslint-disable-next-line no-underscore-dangle
 | 
						|
 | 
						|
            cDst._comment = cSrc._comment;
 | 
						|
          } else {
 | 
						|
            this._cells[i + nExpand - 1] = undefined;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      } // now add the new values
 | 
						|
 | 
						|
 | 
						|
      for (i = 0; i < inserts.length; i++) {
 | 
						|
        cDst = this.getCell(start + i);
 | 
						|
        cDst.value = inserts[i];
 | 
						|
        cDst.style = {}; // eslint-disable-next-line no-underscore-dangle
 | 
						|
 | 
						|
        cDst._comment = undefined;
 | 
						|
      }
 | 
						|
    } // Iterate over all non-null cells in this row
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "eachCell",
 | 
						|
    value: function eachCell(options, iteratee) {
 | 
						|
      if (!iteratee) {
 | 
						|
        iteratee = options;
 | 
						|
        options = null;
 | 
						|
      }
 | 
						|
 | 
						|
      if (options && options.includeEmpty) {
 | 
						|
        var n = this._cells.length;
 | 
						|
 | 
						|
        for (var i = 1; i <= n; i++) {
 | 
						|
          iteratee(this.getCell(i), i);
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        this._cells.forEach(function (cell, index) {
 | 
						|
          if (cell && cell.type !== Enums.ValueType.Null) {
 | 
						|
            iteratee(cell, index + 1);
 | 
						|
          }
 | 
						|
        });
 | 
						|
      }
 | 
						|
    } // ===========================================================================
 | 
						|
    // Page Breaks
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "addPageBreak",
 | 
						|
    value: function addPageBreak(lft, rght) {
 | 
						|
      var ws = this._worksheet;
 | 
						|
      var left = Math.max(0, lft - 1) || 0;
 | 
						|
      var right = Math.max(0, rght - 1) || 16838;
 | 
						|
      var pb = {
 | 
						|
        id: this._number,
 | 
						|
        max: right,
 | 
						|
        man: 1
 | 
						|
      };
 | 
						|
      if (left) pb.min = left;
 | 
						|
      ws.rowBreaks.push(pb);
 | 
						|
    } // return a sparse array of cell values
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "_applyStyle",
 | 
						|
    // =========================================================================
 | 
						|
    // styles
 | 
						|
    value: function _applyStyle(name, value) {
 | 
						|
      this.style[name] = value;
 | 
						|
 | 
						|
      this._cells.forEach(function (cell) {
 | 
						|
        if (cell) {
 | 
						|
          cell[name] = value;
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      return value;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "number",
 | 
						|
    get: function get() {
 | 
						|
      return this._number;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "worksheet",
 | 
						|
    get: function get() {
 | 
						|
      return this._worksheet;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "values",
 | 
						|
    get: function get() {
 | 
						|
      var values = [];
 | 
						|
 | 
						|
      this._cells.forEach(function (cell) {
 | 
						|
        if (cell && cell.type !== Enums.ValueType.Null) {
 | 
						|
          values[cell.col] = cell.value;
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      return values;
 | 
						|
    } // set the values by contiguous or sparse array, or by key'd object literal
 | 
						|
    ,
 | 
						|
    set: function set(value) {
 | 
						|
      var _this = this;
 | 
						|
 | 
						|
      // this operation is not additive - any prior cells are removed
 | 
						|
      this._cells = [];
 | 
						|
 | 
						|
      if (!value) {// empty row
 | 
						|
      } else if (value instanceof Array) {
 | 
						|
        var offset = 0;
 | 
						|
 | 
						|
        if (value.hasOwnProperty('0')) {
 | 
						|
          // contiguous array - start at column 1
 | 
						|
          offset = 1;
 | 
						|
        }
 | 
						|
 | 
						|
        value.forEach(function (item, index) {
 | 
						|
          if (item !== undefined) {
 | 
						|
            _this.getCellEx({
 | 
						|
              address: colCache.encodeAddress(_this._number, index + offset),
 | 
						|
              row: _this._number,
 | 
						|
              col: index + offset
 | 
						|
            }).value = item;
 | 
						|
          }
 | 
						|
        });
 | 
						|
      } else {
 | 
						|
        // assume object with column keys
 | 
						|
        this._worksheet.eachColumnKey(function (column, key) {
 | 
						|
          if (value[key] !== undefined) {
 | 
						|
            _this.getCellEx({
 | 
						|
              address: colCache.encodeAddress(_this._number, column.number),
 | 
						|
              row: _this._number,
 | 
						|
              col: column.number
 | 
						|
            }).value = value[key];
 | 
						|
          }
 | 
						|
        });
 | 
						|
      }
 | 
						|
    } // returns true if the row includes at least one cell with a value
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "hasValues",
 | 
						|
    get: function get() {
 | 
						|
      return _.some(this._cells, function (cell) {
 | 
						|
        return cell && cell.type !== Enums.ValueType.Null;
 | 
						|
      });
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "cellCount",
 | 
						|
    get: function get() {
 | 
						|
      return this._cells.length;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "actualCellCount",
 | 
						|
    get: function get() {
 | 
						|
      var count = 0;
 | 
						|
      this.eachCell(function () {
 | 
						|
        count++;
 | 
						|
      });
 | 
						|
      return count;
 | 
						|
    } // get the min and max column number for the non-null cells in this row or null
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "dimensions",
 | 
						|
    get: function get() {
 | 
						|
      var min = 0;
 | 
						|
      var max = 0;
 | 
						|
 | 
						|
      this._cells.forEach(function (cell) {
 | 
						|
        if (cell && cell.type !== Enums.ValueType.Null) {
 | 
						|
          if (!min || min > cell.col) {
 | 
						|
            min = cell.col;
 | 
						|
          }
 | 
						|
 | 
						|
          if (max < cell.col) {
 | 
						|
            max = cell.col;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      return min > 0 ? {
 | 
						|
        min: min,
 | 
						|
        max: max
 | 
						|
      } : null;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "numFmt",
 | 
						|
    get: function get() {
 | 
						|
      return this.style.numFmt;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._applyStyle('numFmt', value);
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "font",
 | 
						|
    get: function get() {
 | 
						|
      return this.style.font;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._applyStyle('font', value);
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "alignment",
 | 
						|
    get: function get() {
 | 
						|
      return this.style.alignment;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._applyStyle('alignment', value);
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "protection",
 | 
						|
    get: function get() {
 | 
						|
      return this.style.protection;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._applyStyle('protection', value);
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "border",
 | 
						|
    get: function get() {
 | 
						|
      return this.style.border;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._applyStyle('border', value);
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "fill",
 | 
						|
    get: function get() {
 | 
						|
      return this.style.fill;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._applyStyle('fill', value);
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "hidden",
 | 
						|
    get: function get() {
 | 
						|
      return !!this._hidden;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._hidden = value;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "outlineLevel",
 | 
						|
    get: function get() {
 | 
						|
      return this._outlineLevel || 0;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      this._outlineLevel = value;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "collapsed",
 | 
						|
    get: function get() {
 | 
						|
      return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow);
 | 
						|
    } // =========================================================================
 | 
						|
 | 
						|
  }, {
 | 
						|
    key: "model",
 | 
						|
    get: function get() {
 | 
						|
      var cells = [];
 | 
						|
      var min = 0;
 | 
						|
      var max = 0;
 | 
						|
 | 
						|
      this._cells.forEach(function (cell) {
 | 
						|
        if (cell) {
 | 
						|
          var cellModel = cell.model;
 | 
						|
 | 
						|
          if (cellModel) {
 | 
						|
            if (!min || min > cell.col) {
 | 
						|
              min = cell.col;
 | 
						|
            }
 | 
						|
 | 
						|
            if (max < cell.col) {
 | 
						|
              max = cell.col;
 | 
						|
            }
 | 
						|
 | 
						|
            cells.push(cellModel);
 | 
						|
          }
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      return this.height || cells.length ? {
 | 
						|
        cells: cells,
 | 
						|
        number: this.number,
 | 
						|
        min: min,
 | 
						|
        max: max,
 | 
						|
        height: this.height,
 | 
						|
        style: this.style,
 | 
						|
        hidden: this.hidden,
 | 
						|
        outlineLevel: this.outlineLevel,
 | 
						|
        collapsed: this.collapsed
 | 
						|
      } : null;
 | 
						|
    },
 | 
						|
    set: function set(value) {
 | 
						|
      var _this2 = this;
 | 
						|
 | 
						|
      if (value.number !== this._number) {
 | 
						|
        throw new Error('Invalid row number in model');
 | 
						|
      }
 | 
						|
 | 
						|
      this._cells = [];
 | 
						|
      var previousAddress;
 | 
						|
      value.cells.forEach(function (cellModel) {
 | 
						|
        switch (cellModel.type) {
 | 
						|
          case Cell.Types.Merge:
 | 
						|
            // special case - don't add this types
 | 
						|
            break;
 | 
						|
 | 
						|
          default:
 | 
						|
            {
 | 
						|
              var address;
 | 
						|
 | 
						|
              if (cellModel.address) {
 | 
						|
                address = colCache.decodeAddress(cellModel.address);
 | 
						|
              } else if (previousAddress) {
 | 
						|
                // This is a <c> element without an r attribute
 | 
						|
                // Assume that it's the cell for the next column
 | 
						|
                var _previousAddress = previousAddress,
 | 
						|
                    row = _previousAddress.row;
 | 
						|
                var col = previousAddress.col + 1;
 | 
						|
                address = {
 | 
						|
                  row: row,
 | 
						|
                  col: col,
 | 
						|
                  address: colCache.encodeAddress(row, col),
 | 
						|
                  $col$row: "$".concat(colCache.n2l(col), "$").concat(row)
 | 
						|
                };
 | 
						|
              }
 | 
						|
 | 
						|
              previousAddress = address;
 | 
						|
 | 
						|
              var cell = _this2.getCellEx(address);
 | 
						|
 | 
						|
              cell.model = cellModel;
 | 
						|
              break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      if (value.height) {
 | 
						|
        this.height = value.height;
 | 
						|
      } else {
 | 
						|
        delete this.height;
 | 
						|
      }
 | 
						|
 | 
						|
      this.hidden = value.hidden;
 | 
						|
      this.outlineLevel = value.outlineLevel || 0;
 | 
						|
      this.style = value.style && JSON.parse(JSON.stringify(value.style)) || {};
 | 
						|
    }
 | 
						|
  }]);
 | 
						|
 | 
						|
  return Row;
 | 
						|
}();
 | 
						|
 | 
						|
module.exports = Row;
 | 
						|
//# sourceMappingURL=row.js.map
 |