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
 |