我试图在excel文件中导出拉力赛网格数据,但只获取标题而不是值

时间:2015-02-04 13:26:59

标签: excel extjs rally

我正在尝试在excel文件中导出拉力赛网格数据,但只获取标题而不是值。 下面是我编写的用于生成网格和导出按钮的代码

从这里[https://github.com/andreano/TaskDelta/blob/master/App.js],我偷了导出代码

            prepareChart: function(iteration_data) {                
                this.converted_values = [];
                this.accept_values = [];
                this.commit_values = [];
                parents = [];
                rootParent = this.getContext().getProject().Name;
                sortedArray = [];    
                var project_hash = {}; // project_by_name, with children
                Ext.Array.each(iteration_data, function(iteration){
                    if ((iteration.ProjectName != rootParent && iteration.ChildCount > 0) || iteration.ParentName == rootParent) {
                        parents.push(iteration.ProjectName);
                    }
                    // make a place for me
                    if ( ! project_hash[iteration.ProjectName] ) { project_hash[iteration.ProjectName] = []; }
                    // make a place for my parent so it can know children
                    if ( iteration.ParentName ) {
                        if ( ! project_hash[iteration.ParentName]) { project_hash[iteration.ParentName] = []; }
                        project_hash[iteration.ParentName] = Ext.Array.merge( project_hash[iteration.ParentName], iteration.ProjectName);
                    }
                }, this);
                // build order this way:
                //console.log("Current: ", this.getContext().getProject().Name );

                // order the array by parents to children to grandchildren
                sortedArray = this._getTreeArray( this.getContext().getProject().Name , project_hash);
                parents = Ext.Array.unique(parents); 

                sortedData = [];
                Ext.Array.each(sortedArray, function(name){
                    Ext.Array.each(iteration_data, function(ite){
                        if(ite.ProjectName == name) {
                            sortedData.push(ite);
                        };  
                    });
                }); 

                Ext.Array.each(iteration_data, function(iteration){
                    if (iteration.ProjectName == rootParent) {
                        sortedData.push(iteration);
                    }
                }, this);
                iteration_data = sortedData;
                sprints = [];
                teams = [];
                this.ratio = {};
                for ( var i=0; i<iteration_data.length; i++ ) {
                    commit_accept_ratio = 0;
                    var data_point = iteration_data[i];
                    this.commit_values.push( data_point.Commit );
                    this.accept_values.push( data_point.Accept );
                    if ( data_point.Commit > data_point.Accept ) {
                        this.converted_values.push( data_point.Commit - data_point.Accept );
                    } else {
                        this.converted_values.push( 0 );
                    }
                    if (data_point.Commit != 0) {
                        commit_accept_ratio = (data_point.Accept / data_point.Commit ) * 100;
                    } else {
                        commit_accept_ratio = 0;
                    };
                    sprints.push(iteration_data[i].Name);
                    teams.push(iteration_data[i].ProjectName);
                    teams.push(rootParent);
                    this.ratio[data_point.ObjectID] = commit_accept_ratio;
                }
                this.sprints = Ext.Array.unique(sprints).sort();
                this.teams = Ext.Array.unique(teams);
                removable_teams = [];
                for ( var i=0; i<this.teams.length; i++ ) {
                    team_name = null;
                    var count = 0;
                    Ext.Array.each(iteration_data, function(data) {
                        if (this.teams[i] == data.ProjectName && data.Commit == 0 || null || undefined && data.Accept == 0 || null || undefined) {
                            count += 1;
                            team_name = data.ProjectName;
                        }
                    }, this);
                    if (count == this.sprints.length) {
                        removable_teams.push(team_name);
                    }
                }                   
                removable_teams = Ext.Array.unique(removable_teams);    
                records = [];
                recordHash = {};
                summaryHash = {};
                Ext.Array.each(iteration_data, function(iter) {
                    if (!recordHash[iter.ProjectName]) {
                        recordHash[iter.ProjectName] = {
                            Team: iter.ProjectName,
                            Name: '4 Sprint Summary',
                            Commit: [],
                            Accept: [],
                            Perc: [],
                            Summary: 0
                        };
                    }
                    if (!Ext.Array.contains(removable_teams, iter.ProjectName)) {
                        recordHash[iter.ProjectName]["Commit-" + iter.Name] = iter.Commit;
                        recordHash[iter.ProjectName]["Accept-" + iter.Name] = iter.Accept;
                        recordHash[iter.ProjectName]["Perc-" + iter.Name] = this.ratio[iter.ObjectID];  
                    }   
                }, this);
                var summaryArray = Ext.Array.slice( this.sprints, (this.sprints.length - 4))
                var iterated_data = [];
                Ext.Array.each(summaryArray, function(summ){
                    Ext.Array.each(iteration_data, function(team) {
                        if( summ == team.Name){
                            iterated_data.push(team);
                        }
                    });
                }); 
                Ext.Array.each(iteration_data, function(summ){
                    Ext.Array.each(iterated_data, function(team) {
                        if (!summaryHash[team.ProjectName]) {
                            summaryHash[team.ProjectName] = {
                                Commit: 0,
                                Accept: 0,
                                Total: 0
                            };
                        };                          
                        if (!Ext.Array.contains(removable_teams, team.ProjectName)) {
                            if( summ.ProjectName == team.ProjectName && summ.Name == team.Name) {
                                summaryHash[team.ProjectName]["Commit"] += summ.Commit;
                                summaryHash[team.ProjectName]["Accept"] += summ.Accept;
                                if (summaryHash[team.ProjectName]["Commit"] != 0) {
                                    summaryHash[team.ProjectName]["Total"] = (summaryHash[team.ProjectName]["Accept"] / summaryHash[team.ProjectName]["Commit"] ) * 100;
                                } else {
                                    summaryHash[team.ProjectName]["Total"] = 0;
                                };  
                            };
                        }   
                    });                     
                }, this);
                Ext.Object.each(recordHash, function(key, value) {              
                    if (summaryHash[key]) {
                        value["Summary"] = summaryHash[key].Total;
                        records.push(value);
                    }   
                });
                var cfgsValues = [];
                cfgsValues.push({text: 'Team', style:"background-color: #D2EBC8", dataIndex: 'Team', width: 170, renderer: function(value, meta_data, record, row, col) {
                    if (Ext.Array.contains(parents, value)) {
                        meta_data.style = "background-color: #FFF09E";
                        return Ext.String.format("<div style='font-weight:bold;text-align:center'>{0}</div>", value);
                    } else if (rootParent == value){
                        meta_data.style = "background-color: #CC6699";
                        return Ext.String.format("<div style='font-weight:bold;text-align:center'>{0}</div>", value);                           
                    } else {
                        return value;
                    };
                }});
                cfgsValues.push({text: '4 Sprint Summary', style:"background-color: #D2EBC8", width: 70, dataIndex: 'Summary', renderer: function(value, meta_data, record) {
                    var color = null;
                    if (value >= 80 && value <= 120) {
                        color = "#00AF4F";
                    }   
                    else if (value >= 60 && value <= 80) {
                        color = "#FBFE08";
                    }   
                    else if (value <= 60) {
                        color = "#FC0002";
                    }   
                    else if (value >= 120) {
                        color = "#98CCFB";
                    };      
                    meta_data.style = "background-color: "+color+"";
                    return Ext.Number.toFixed(value, 0)+"%";                    
                }});
                Ext.Array.each(this.sprints, function(sprint) {
                    cfgsValues.push(
                        {text: sprint, style:'background-color:#D2EBC8;text-align:center;font-weight:bold', defaults: {enableColumnHide:false}, columns:[
                            {text: "Commit", dataIndex: 'Commit-' + sprint, width: 50, renderer: function(value, meta_data, record) {
                                if( value ) {
                                    return value;
                                } else {
                                    return "NA";
                                }   
                            }},
                            {text: "Accept", dataIndex: 'Accept-' + sprint, width: 60, renderer: function(value, meta_data, record) {
                                if( value) {
                                    return value;
                                } else {
                                    return "NA";
                                }   
                            }},
                            {text: "%", dataIndex: 'Perc-'+ sprint, width: 50, renderer: function(value, meta_data, record) {
                                var color = null;
                                if (value >= 80 && value <= 120) {
                                    color = "#00AF4F";
                                }   
                                else if (value >= 60 && value <= 80) {
                                    color = "#FBFE08";
                                }   
                                else if (value <= 60) {
                                    color = "#FC0002";
                                }   
                                else if (value >= 120) {
                                    color = "#98CCFB";
                                }   
                                meta_data.style = "background-color: "+color+"";
                                if (value) {
                                    return Ext.Number.toFixed(value, 0)+"%";
                                } else {
                                    return "NA";
                                };  
                            }}
                        ]}  
                    );
                });
                var chart = Ext.getCmp('mychart');
                if (chart) {
                    chart.destroy();
                };  
                Ext.Array.each(this.sprints, function(sprint) {
                    Ext.Array.each(records, function(record) {
                        if (record["Accept-" + sprint] == undefined) {  
                            record["Accept-" + sprint] = undefined;
                        }
                        if (record["Commit-" + sprint] == undefined) {  
                            record["Commit-" + sprint] = undefined;
                        }   
                        if (record["Perc-" + sprint] == undefined) {    
                            record["Perc-" + sprint] = undefined;
                        }                               
                    });
                });
                this.add({
                    xtype: 'rallygrid',
                    id: 'mychart',  
                    store: Ext.create('Rally.data.custom.Store', {
                        data: records,
                        pageSize: 100
                    }),
                    //viewConfig: { 
                        //stripeRows: false
                    //},                        
                    columnCfgs: cfgsValues,
                    //columnLines: true
                }); 
                this.globalStore = Ext.getCmp('mychart');
                console.log("this.globalStore", this.globalStore);
                this.down('#grid_box').add(this.globalStore);
                //this.setLoading(false);
            },
            _addPrintButton: function() {
                var me = this;
                this.down('#print_button_box').add( { 
                    xtype: 'rallybutton', 
                    itemId: 'print_button',
                    text: 'Export to Excel',
                    disabled: false,
                    margin: '20 10 10 0',
                    region: "right",                        
                    handler: function() {
                        me._onClickExport();
                    }
                });
            },              
            _onClickExport: function () { //using this function to export to csv
                var that = this;        
                if (this.down('#grid_box')){
                    //Ext.getBody().mask('Exporting Tasks...');
                    //console.log('inside export');
                    setTimeout(function () {
                        var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-' +
                            'microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head>' +
                            '<!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>' +
                            '{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>' +
                            '</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}' +
                            '</table></body></html>';

                        var base64 = function (s) {
                            return window.btoa(unescape(encodeURIComponent(s)));
                        };
                        var format = function (s, c) {
                            return s.replace(/{(\w+)}/g, function (m, p) {
                                return c[p];
                            });
                        };
                        var table = that.getComponent('grid_box');
                        //console.log("Exporting table ",table);
                        var excel_data = '<tr>';
                        Ext.Array.each(table.getEl().dom.outerHTML.match(/<span .*?x-column-header-text.*?>.*?<\/span>/gm), function (column_header_span) {
                            excel_data += (column_header_span.replace(/span/g, 'td'));
                        });
                        excel_data += '</tr>';
                        Ext.Array.each(table.getEl().dom.outerHTML.match(/<tr class="x-grid-row.*?<\/tr>/gm), function (line) {
                            excel_data += line.replace(/[^\011\012\015\040-\177]/g, '>>');
                        });
                        //console.log("Excel data ",excel_data);
                        var ctx = {worksheet: name || 'Worksheet', table: excel_data};
                        window.location.href = 'data:application/vnd.ms-excel;base64,' + base64(format(template, ctx));
                        Ext.getBody().unmask();
                    }, 500);
                }else{
                    console.log("grid_box does not exist");
                }
            }           

1 个答案:

答案 0 :(得分:1)

在导出到CSV的新AppSDK2文档中有an example。 我还有一个在this github repo中导出为CSV的示例。