/** * This class is used to create an xml Excel Cell. * * The data type of the cell value is automatically determined. */Ext.define('Ext.exporter.file.excel.Cell', { extend: 'Ext.exporter.file.Base', config: { /** * @cfg {String} dataType (required) * * Excel data type for the cell value. It is automatically set when the value is set. * * Possible values: `Number`, `DateTime`, `Boolean`, `String` */ dataType: 'String', /** * @cfg {String} formula * * Specifies the formula stored in this cell. All formulas are persisted in R1C1 notation because they are * significantly easier to parse and generate than A1-style formulas. The formula is calculated upon reload * unless calculation is set to manual. Recalculation of the formula overrides the value in this cell's Value config. * * Examples: * * - "=SUM(R1C1:R2C2)": sums up values from Row1/Column1 to Row2/Column2 * - "=SUM(R[-2]C:R[-1]C[1])": sums up values from 2 rows above the current row and current column to * values from 1 row above the current row and 1 column after the current column * - "=SUM(R[-1]C,R[-1]C[1])": sums up values from cell positioned one row above current row and current column, * and the cell positioned one row above current row and next column * * Check Excel for more formulas. */ formula: null, /** * @cfg {Number} index * * Specifies the column index of this cell within the containing row. If this tag is not specified, the first * instance of a Cell element within a row has an assumed Index="1". Each additional Cell element has an assumed * Index that is one higher. * * Indices must appear in strictly increasing order. Failure to do so will result in an XML Spreadsheet * document that is invalid. Indices do not need to be sequential, however. Omitted indices are formatted with * either the default format, the column's format, or the table's format (depending on what has been specified). * * Indices must not overlap. If duplicates exist, the behavior is unspecified and the XML Spreadsheet document * is considered invalid. If the previous cell is a merged cell and no index is specified on this cell, its * start index is assumed to be the first cell after the merge. */ index: null, /** * @cfg {String} styleId * * Excel style attached to this cell */ styleId: null, /** * @cfg {Number} mergeAcross * * Number of cells to merge to the right side of this cell */ mergeAcross: null, /** * @cfg {Number} mergeDown * * Number of cells to merge below this cell */ mergeDown: null, /** * @cfg {Number/Date/String} value (required) * * Value assigned to this cell */ value: '' }, tpl: [ ' <Cell', '<tpl if="this.exists(index)"> ss:Index="{index}"</tpl>', '<tpl if="this.exists(styleId)"> ss:StyleID="{styleId}"</tpl>', '<tpl if="this.exists(mergeAcross)"> ss:MergeAcross="{mergeAcross}"</tpl>', '<tpl if="this.exists(mergeDown)"> ss:MergeDown="{mergeDown}"</tpl>', '<tpl if="this.exists(formula)"> ss:Formula="{formula}"</tpl>', '>\n', ' <Data ss:Type="{dataType}">{value}</Data>\n', ' </Cell>\n', { exists: function(value){ return !Ext.isEmpty(value); } } ], applyValue: function(v){ var dt = 'String', format = Ext.util.Format; // let's detect the data type if(v instanceof Date){ dt = 'DateTime'; v = Ext.Date.format(v, 'Y-m-d\\TH:i:s.u'); }else if(Ext.isNumber(v)) { dt = 'Number'; }else if(Ext.isBoolean(v)){ dt = 'Boolean'; }else{ // cannot use here stripTags // this value goes into an xml tag and we need to force html encoding // for chars like &>< v = format.htmlEncode(format.htmlDecode(v)) } this.setDataType(dt); return v; } });