    /** * @private */Ext.define('Ext.exporter.file.ooxml.excel.Worksheet', {    extend: 'Ext.exporter.file.ooxml.excel.Sheet',     requires: [        'Ext.exporter.file.ooxml.excel.Column',        'Ext.exporter.file.ooxml.excel.Row'    ],     isWorksheet: true,     config: {        columns: null,        rows: [],        drawings: null,        tables: null,        mergeCells: null         //comments: null,         //pivotTables: null,         //tableSingleCell: null     },     folder: 'worksheets',    fileName: 'sheet',     contentType: {        contentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'    },     relationship: {        schema: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet'    },     tpl: [        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>',        '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" ',        'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">',        '<tpl if="columns">',        '<cols>',        '<tpl for="columns.getRange()">{[values.render()]}</tpl>',        '</cols>',        '</tpl>',        '<sheetData>',        '<tpl if="rows"><tpl for="rows.getRange()">{[values.render()]}</tpl></tpl>',        '</sheetData>',        '<tpl if="rows">',        '<mergeCells>',            '<tpl for="rows.getRange()">',                '<tpl for="_cells.items">',                '<tpl if="isMergedCell"><mergeCell ref="{[values.getMergedCellRef()]}"/></tpl>',                '</tpl>',            '</tpl>',        '</mergeCells>',        '</tpl>',        '</worksheet>'    ],     destroy: function(){        var me = this;         me.setRows(null);        me.setTables(null);        me.setDrawings(null);                me.callParent();    },     applyColumns: function(data, dataCollection){        return this.checkCollection(data, dataCollection, 'Ext.exporter.file.ooxml.excel.Column');    },     applyRows: function(data, dataCollection){        return this.checkCollection(data, dataCollection, 'Ext.exporter.file.ooxml.excel.Row');    },     updateRows: function(collection, oldCollection){        var me = this;         if(oldCollection){            oldCollection.un({                add: me.onRowAdd,                remove: me.onRowRemove,                scope: me            });        }        if(collection){            collection.on({                add: me.onRowAdd,                remove: me.onRowRemove,                scope: me            });            me.onRowAdd(collection, {items: collection.getRange()});        }    },     onRowAdd: function(collection, details){        var items = details.items,            length = items.length,            i, item;         for(i = 0; i < length; i++) {            item = items[i];            item.setWorksheet(this);        }        this.updateRowIndexes();    },     onRowRemove: function(collection, details){        Ext.destroy(details.items);    },     updateRowIndexes: function(){        var rows = this.getRows(),            i, len, row;         if(!rows){            return;        }        len = rows.length;        for(i = 0; i < len; i++){            row = rows.getAt(i);            if(!row.getIndex()) {                row.setIndex(i + 1);            }        }    },     updateDrawings: function(data){        var rels = this.getRelationships();         if(oldData && rels){            rels.removeRelationship(oldData.getRelationship());        }        if(data && rels){            rels.addRelationship(data.getRelationship());        }    },     updateTables: function(data){        var rels = this.getRelationships();         if(oldData && rels){            rels.removeRelationship(oldData.getRelationship());        }        if(data && rels){            rels.addRelationship(data.getRelationship());        }    },     /**     * Convenience method to add column infos.     * @param {Object/Array} config     * @return {Ext.exporter.file.ooxml.excel.Column/Ext.exporter.file.ooxml.excel.Column[]}     */    addColumn: function(config){        if(!this.getColumns()){            this.setColumns([]);        }        return this.getColumns().add(config || {});    },     /**     * Convenience method to add rows.     * @param {Object/Array} config     * @return {Ext.exporter.file.ooxml.excel.Row/Ext.exporter.file.ooxml.excel.Row[]}     */    addRow: function(config){        return this.getRows().add(config || {});    },     /**     * Convenience method to fetch a row by its id.     * @param id     * @return {Ext.exporter.file.ooxml.excel.Row}     */    getRow: function(id){        return this.getRows().get(id);    }  });