2013-02-22 40 views
1

我想将我的SDK2网格导出为CSV或Excel--我怀疑此代码可能存在于拉力赛某处,因为您可以将用户案例从组合项导出为CSV。将SDK2网格导出为CSV

是否有解决方案,人们都知道,可以发布?

我在Sencha网站上发现了一些thread of this,它完全是客户端,但我一直无法使用拉力赛SDK2网格使它工作。

我怀疑如果你只想去CSV,可能会有比较简单的解决方案。

回答

5

查看了上面Charles提供的示例,并将此简化对象导出为EXT-JS网格(因此也适用于拉力网格)。

对于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; 
     } 
    } 
}); 
+0

不错。您还需要在_getFieldText中为数字添加一个测试:like} else if(typeof(fieldData)===“number”){text =''+ fieldData; }否则如果(!fieldData.match){ //不是我们识别的字符串或对象...将其空白出来 text ='';其他{ } text = fieldData; } – curmudgeon 2013-03-07 18:51:47

1

您可以通过从底层商店获取数据并创建Data URI来创建网格导出。您可能会遇到问题,以便在不同浏览器中正常工作。

您还可以看到Bryntum在此处制作的东西。