2013-02-22 4 views
1

내 SDK2 그리드를 CSV 또는 Excel로 내보내고 싶습니다. 예를 들어 사용자 스토리를 CSV로 내보낼 수 있기 때문에이 코드가 랠리 어딘가에있는 것 같습니다.SDK2 그리드를 CSV로 내보내기

사람들이 알고 있고 게시 할 수있는 해결책이 있습니까?

전적으로 클라이언트 측 인 Sencha 웹 사이트에서 thread of this을 찾았지만 Rally SDK2 그리드를 사용하여 작동시키지 못했습니다.

CSV로만 가고 싶다면 아주 간단한 해결책이있을 것 같습니다.

답변

5

위의 Charles가 제공 한 예제를 살펴보고 EXT-JS 그리드를 내보내는 간단한 개체를 만들었습니다. (또한 Rally Grid에서도 작동합니다.)

IE의 경우 다른 브라우저는 CSV를 다운로드하기 때문에 Excel로 곧바로 이동합니다. 그러나 데이터 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; 
     } 
    } 
}); 
+0

니스. } _getFieldText에 숫자에 대한 테스트도 추가 할 수 있습니다. else if (typeof (fieldData) === "number") { text = ''+ fieldData; } else if (! fieldData.match) { // 우리가 인식하는 문자열이나 객체가 아닙니다 ... 공백으로 만듭니다. text = ''; } else { text = fieldData; } – curmudgeon

1

기본 저장소에서 데이터를 가져 와서 Data URI을 생성하여 그리드에서 내보내기를 만들 수 있습니다. 여러 브라우저에서 잘 작동하는 데 문제가있을 것입니다.

여기에 Bryntum의 내용을 볼 수도 있습니다.