1

SDK2 グリッドを CSV または Excel にエクスポートしたいのですが、たとえばユーザー ストーリーをポートフォリオ アイテムから CSV にエクスポートできるため、このコードはおそらく Rally のどこかにあるのではないかと思います。

人々が認識して投稿できる解決策はありますか?

完全にクライアント側である Sencha Web サイトでこのスレッドをいくつか見つけましたが、Rally SDK2 グリッドを使用して動作させることができませんでした。

CSV のみを使用する場合は、もっと簡単な解決策があるのではないかと思います。

4

2 に答える 2

5

上記の Charles の例を見て、この簡略化されたオブジェクトを作成して EXT-JS グリッドをエクスポートしました (したがって、Rally Grid でも機能します)。

IE の場合は Excel に直行し、他のブラウザの場合は CSV をダウンロードしますが、Data URI アプローチを使用すると少し不安定ですが (ファイル名は制御できず、Excel は開く前に少し文句を言います)、機能します。

実際に Javascript を知っている人が改善を投稿したい場合は、感謝します!

// Derived and simplified from example on bryntum.com

Ext.define("GridExporter", {
    dateFormat : 'Y-m-d g:i',

    exportGrid: function(grid) {
        if (Ext.isIE) {
            this._ieToExcel(grid);

        } else {
            var data = this._getCSV(grid);

            window.location = 'data:text/csv;charset=utf8,' + encodeURIComponent(data);
        }
    },

    _escapeForCSV: function(string) {
        if (string.match(/,/)) {
            if (!string.match(/"/)) {
                string = '"' + string + '"';
            } else {
                string = string.replace(/,/g, ''); // comma's and quotes-- sorry, just loose the commas
            }
        }
        return string;
    },

    _getFieldText: function(fieldData) {
        var text;

        if (fieldData == null || fieldData == undefined) {
            text = '';

        } else if (fieldData._refObjectName && !fieldData.getMonth) {
            text = fieldData._refObjectName;

        } else if (fieldData instanceof Date) {
            text = Ext.Date.format(fieldData, this.dateFormat);

        } else if (!fieldData.match) { // not a string or object we recognize...bank it out
            text = '';

        } else {
            text = fieldData;
        }

        return text;
    },

    _getFieldTextAndEscape: function(fieldData) {
        var string  = this._getFieldText(fieldData);

        return this._escapeForCSV(string);
    },

    _getCSV: function (grid) {
        var cols    = grid.columns;
        var store   = grid.store;
        var data    = '';

        var that = this;
        Ext.Array.each(cols, function(col, index) {
            if (col.hidden != true) {
                data += that._getFieldTextAndEscape(col.text) + ',';
            }
        });
        data += "\n";

        store.each(function(record) {
            var entry       = record.getData();
            Ext.Array.each(cols, function(col, index) {
                if (col.hidden != true) {
                    var fieldName   = col.dataIndex;
                    var text        = entry[fieldName];

                    data += that._getFieldTextAndEscape(text) + ',';
                }
            });
            data += "\n";
        });

        return data;
    },

    _ieGetGridData : function(grid, sheet) {
        var that            = this;
        var resourceItems   = grid.store.data.items;
        var cols            = grid.columns;

        Ext.Array.each(cols, function(col, colIndex) {
            if (col.hidden != true) {
                console.log('header: ', col.text);
                sheet.cells(1,colIndex + 1).value = col.text;
            }
        });

        var rowIndex = 2;
        grid.store.each(function(record) {
            var entry   = record.getData();

            Ext.Array.each(cols, function(col, colIndex) {
                if (col.hidden != true) {
                    var fieldName   = col.dataIndex;
                    var text        = entry[fieldName];
                    var value       = that._getFieldText(text);

                    sheet.cells(rowIndex, colIndex+1).value = value;
                }
            });
            rowIndex++;
        });
    },

    _ieToExcel: function (grid) {
        if (window.ActiveXObject){
            var  xlApp, xlBook;
            try {
                xlApp = new ActiveXObject("Excel.Application"); 
                xlBook = xlApp.Workbooks.Add();
            } catch (e) {
                Ext.Msg.alert('Error', 'For the export to work in IE, you have to enable a security setting called "Initialize and script ActiveX control not marked as safe" from Internet Options -> Security -> Custom level..."');
                return;
            }

            xlBook.worksheets("Sheet1").activate;
            var XlSheet = xlBook.activeSheet;
            xlApp.visible = true; 

           this._ieGetGridData(grid, XlSheet);
           XlSheet.columns.autofit; 
        }
    }
});
于 2013-03-07T05:29:42.150 に答える
1

基になるストアからデータを取得し、データURIを作成することで、グリッドからエクスポートを作成できます。おそらく、さまざまなブラウザでうまく機能させるために問題が発生するでしょう。

ブリンタムが作ったものもここで見ることができます。

于 2013-02-22T20:28:41.723 に答える