js/spreadsheet/EditorData.js (112 lines of code) (raw):

/** * @file data table data * @author sushuang(sushuang@baidu.com) */ define(function (require) { var $ = require('jquery'); var dtLib = require('dt/lib'); /** * @class */ var EditorData = function (htIns) { this._data = htIns.getSourceData(); this._htIns = htIns; }; var editorDataProto = EditorData.prototype; /** * 清空所有数据 * * @pubilc */ editorDataProto.clear = function () { // 使用全赋null的方式,不可破坏editorData的结构。 for (var i = 0, data = this._data, len = data.length; i < len; i++) { for (var j = 0, lenj = data[i].length; j < lenj; j++) { data[i][j] = null; } } }; /** * 扩展data尺寸。在使用uncheckSet前使用。 * 这种设计难看,但这是为了适配handsontable,同时性能考虑。 * * @public * @param {number} rowCount 如果小于当前data的rowCount,则row不扩展。 * @param {number} colCount 如果小于当前data的colCount,则col不扩展。 */ editorDataProto.enlarge = function (rowCount, colCount) { var data = this._data; var currColCount = this._htIns.countCols(); colCount = Math.max(colCount, currColCount); if (colCount > currColCount) { for (var i = 0, len = data.length; i < len; i++) { data.length = colCount; } } if (rowCount > data.length) { for (var i = data.length; i < rowCount; i++) { data.push(new Array(colCount)); } } }; /** * 向data中设置值。 * uncheck的意思是,向二维数组中set前不检查非空(性能考虑)。 * 所以使用uncheckSet前,应该先使用enlarge函数,保证data二维数组的尺寸足够大。 * 此方法会被频繁调用。 * * @public */ editorDataProto.uncheckSet = function (rowIndex, colIndex, data) { this._data[rowIndex][colIndex] = data; }; /** * 将二维数组写入handsontable中 * * @public * @param {Array} data */ editorDataProto.writeArray = function (data, itemFormatter) { var data = data || [[]]; var rowCount = data.length; var colCount = 0; $.each(data, function (idx, item) { var item = item || []; colCount = Math.max(item.length, colCount); }); this.clear(); this.enlarge(rowCount, colCount); var me = this; $.each(data, function (idx, itemx) { $.each(itemx || [], function (idy, itemy) { me.uncheckSet(idx, idy, itemFormatter(itemy)); }); }); }; /** * 得到data中的值。如果rowIndex或colIndex超出范围,不会抛异常而是返回空。 * 此方法会被频繁调用。 * * @public * @param {number} rowIndex * @param {number} colIndex * @param {string=} dataType 提供数据过滤的功能(如适当地处理null、非法number、trim等情况)。 * 可以是'string', 'number', 'auto'(能转成number则为number,否则为string)。 * 如果不传,则返回原始值。 * 注意,number支持 111e2 这种形式。也就是说,excel中输入了111e2,得到的值是11100。 * @return {*} value * string时返回值必为string. * number时如果非法则返回null. */ editorDataProto.get = function (rowIndex, colIndex, dataType) { var row = this._data[rowIndex]; var value = row ? row[colIndex] : null; // Empty value is null and ''. // If a cell has been edited, the value can not be null but ''. if (value === '') { value = null; } if (dataType === 'string') { value = value == null ? '' : String(value); } else if (dataType === 'number') { value = dtLib.getNumber(value); } else if (dataType === 'auto') { var newValue = dtLib.getNumber(value); if (newValue != null) { value = newValue; } } return value; }; /** * 是否是空单元格 * * @public * @param {number} rowIndex * @param {number} colIndex * @return {boolean} isBlank */ editorDataProto.isBlank = function (rowIndex, colIndex) { return dtLib.isBlank(this.get(rowIndex, colIndex)); }; /** * @public */ editorDataProto.getEmptyValue = function () { return null; // null 表示empty value. }; /** * 得到数据边界 * * @public * @param {Object} htIns * @return {Object} {colCount: ..., rowCount: ...} */ editorDataProto.getDataWindowSize = function () { var htIns = this._htIns; var colCount = htIns.countCols(); var rowCount = htIns.countRows(); var editorData = htIns.dtEditorData; // 找到row数据边界 var i = rowCount - 1; var realRowCount = 0; for (; i >= 0; i--) { for (var j = 0; j < colCount; j++) { if (editorData.get(i, j) != null) { realRowCount = i + 1; break; } } if (realRowCount) { break; } } // 找到col数据边界 var j = colCount - 1; var realColCount = 0; for (; j >= 0; j--) { for (var i = 0; i < realRowCount; i++) { var val = editorData.get(i, j); if (val != null && val !== '') { realColCount = j + 1; break; } } if (realColCount) { break; } } return {colCount: realColCount, rowCount: realRowCount}; }; return EditorData; });