ExtJS 4.2 将网格数据导出到可下载的 CSV 文件

Posted

技术标签:

【中文标题】ExtJS 4.2 将网格数据导出到可下载的 CSV 文件【英文标题】:ExtJS 4.2 export grid data to downloadable CSV file 【发布时间】:2016-02-20 16:52:34 【问题描述】:

我想在我的 EXT JS 面板中创建一个下载按钮,当单击下载/导出 EXTJS 网格到可下载的 CSV 文件时。 PS:我认为我们可以使用存储数据或我在网格存储中填充数据的 JSON 将数据填充到 CSV 文件中 我已经尝试过 Ext.ux.CSVExporter 但我无法成功使用它。 我当前的代码是:

       <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title id='title'>HTML Page setup Tutorial</title>       
        <link rel="stylesheet" type="text/css" href="ext-all.css" />       
        <script type="text/javascript" src="ext-all.js"></script>
        <script type="text/javascript" src="FileSaver.js"></script>
        <script type="text/javascript" src="Formatter.js"></script>
        <script type="text/javascript" src="CSVFormatter/CSVFormatter.js"></script>
         <script type="text/javascript" src="ExcelFormatter/Cell.js"></script>
        <script type="text/javascript" src="ExcelFormatter/Style.js"></script>
         <script type="text/javascript" src="ExcelFormatter/Workbook.js"></script>
          <script type="text/javascript" src="ExcelFormatter/Worksheet.js"></script>
<script type="text/javascript" src="ExcelFormatter/ExcelFormatter.js"></script>  
        <script type="text/javascript" src="Exporter.js"></script>
        <script type="text/javascript" src="ExporterButton.js"></script>



<script type="text/javascript">
Ext.define('Ext.ux.ProgressBarPager', 

    requires: ['Ext.ProgressBar'],
    /**
     * @cfg Number width
     * <p>The default progress bar width.  Default is 225.</p>
    */
    width   : 225,
    /**
     * @cfg String defaultText
    * <p>The text to display while the store is loading.  Default is 'Loading...'</p>
     */
    defaultText    : 'Loading...',
    /**
     * @cfg Object defaultAnimCfg
     * <p>A @link Ext.fx.Anim Ext.fx.Anim configuration object.</p>
     */
    defaultAnimCfg : 
        duration: 1000,
        easing: 'bounceOut' 
    ,  

    /**
     * Creates new ProgressBarPager.
     * @param Object config Configuration options
     */
    constructor : function(config) 
        if (config) 
            Ext.apply(this, config);
        
    ,
    //public
    init : function (parent) 
        var displayItem;
        if (parent.displayInfo) 
            this.parent = parent;

            displayItem = parent.child("#displayItem");
            if (displayItem) 
                parent.remove(displayItem, true);
            

            this.progressBar = Ext.create('Ext.ProgressBar', 
                text    : this.defaultText,
                width   : this.width,
                animate : this.defaultAnimCfg,
                style: 
                    cursor: 'pointer'
                ,
                listeners: 
                    el: 
                        scope: this,
                        click: this.handleProgressBarClick
                    
                
            );

            parent.displayItem = this.progressBar;

            parent.add(parent.displayItem);
            Ext.apply(parent, this.parentOverrides);
        
    ,
    // private
    // This method handles the click for the progress bar
    handleProgressBarClick : function(e)
        var parent = this.parent,
            displayItem = parent.displayItem,
            box = this.progressBar.getBox(),
            xy = e.getXY(),
            position = xy[0]- box.x,
            pages = Math.ceil(parent.store.getTotalCount() / parent.pageSize),
            newPage = Math.max(Math.ceil(position / (displayItem.width / pages)), 1);

        parent.store.loadPage(newPage);
    ,

    // private, overriddes
    parentOverrides  : 
        // private
        // This method updates the information via the progress bar.
        updateInfo : function()
            if(this.displayItem)
                var count = this.store.getCount(),
                    pageData = this.getPageData(),
                    message = count === 0 ?
                    this.emptyMsg :
                    Ext.String.format(
                        this.displayMsg,
                        pageData.fromRecord, pageData.toRecord, this.store.getTotalCount()
                    ),
                    percentage = pageData.pageCount > 0 ? (pageData.currentPage / pageData.pageCount) : 0;

                this.displayItem.updateProgress(percentage, message, this.animate || this.defaultAnimConfig);
            
        
    
);


Ext.onReady(function() 

    var field = [];
    var columnList = [];
    var counter = 
        "levels":

            [
            "name": "class",
            "samples": [
                "name": "1660SH_3",
                "features": [
                    "count": 8,
                    "name": "Bacteroidia"
                , 
                    "count": 9,
                    "name": "Bacteroidiaa"
                ,
                
                    "count": 10,
                    "name": "Bacteroidiab"
                ,
                
                    "count": 11,
                    "name": "Bacteroidiac"
                ]
            , 
                "name": "1660SH_4",
                "features": [
                    "count": 5,
                    "name": "Bacteroidia"
                , 
                    "count": 6,
                    "name": "Bacteroidiaa"
                ,
                 
                    "count": 7,
                    "name": "Bacteroidiab"
                ,
                
                    "count": 8,
                    "name": "Bacteroidiac"
                ]
            ]
        , ]
    ;
    columnList.push(
        header: "Sample v/s Feature",
        dataIndex: "Sample v/s Feature",
        width: 0.1 * Ext.getBody().getViewSize().width,
        columnLines: true,
        locked: true
    );
    field.push("Sample v/s Feature");
    for (var p = 0; p < Object.keys(counter.levels[0].samples).length; p++) 

        columnList.push(
            header: counter.levels[0].samples[p].name,
            dataIndex: counter.levels[0].samples[p].name,
            flex: 1,
            columnLines: true
        );
        field.push(counter.levels[0].samples[p].name);
    

    if (counter.levels[0].name == 'class') 
      var mydata=[];
        for (var p = 0; p < Object.keys(counter.levels[0].samples[0].features).length; p++)
         
            var s = [];
            s["Sample v/s Feature"] = '<b>' + counter.levels[0].samples[0].features[p].name + '</b>';
            for (var j = 0; j < Object.keys(counter.levels[0].samples).length; j++) 
            
                s[counter.levels[0].samples[j].name] = counter.levels[0].samples[j].features[p].count;
            
            mydata.push(s);

        

        var store = Ext.create('Ext.data.ArrayStore', 
                 autoLoad: false,
                 pageSize : 2,

                fields: field,
                data: 
                    count:mydata.length,
                    data:mydata
                ,
                proxy:
                    type:"memory",
                     enablePaging: true,
                    data:mydata,
                    reader: 
                        type: 'json',
                        root: 'data',

                    
                
            );
         store.load(
    params: 
        // specify params for the first page load if using paging
        start: 0,          
        limit: 2,

    
);


        var classTable = Ext.create('Ext.grid.Panel', 
            style: 'border: solid Blue 1px',
            id: 'family',
            renderTo: Ext.getBody(),
            store: store,
             requires: [
        'Ext.ux.exporter.Exporter'
    ],

            columns: columnList,
            columnLines: true,
            width: Ext.getBody().getViewSize().width,
            height: Ext.getBody().getViewSize().height,
           bbar: 
                xtype: 'pagingtoolbar',
                pageSize: 2,
                store: store,
                displayInfo: true,
                plugins: new Ext.ux.ProgressBarPager()
            ,
             dockedItems:[
                     
                xtype: 'toolbar',
                dock: 'top',
                items: [
                    
                        xtype: 'exporterbutton',
                        text: 'export data'
                    
                         ]
                     
                         ]


        );

    
);




  </script>
  </head>
    <body>

    </body>
</html>

【问题讨论】:

【参考方案1】:

repository link使用这个项目

这里是如何使用它的示例fiddle link

首先将存储库文件复制到您的 ext 库的 ux 文件夹中,该文件夹位于 exporter 文件夹下的 ext/src/ux 中。完整路径将是 ext/src/ux/exporter/[repository_files] 并修改你的网格

  var classTable = Ext.create('Ext.grid.Panel', 
    style: 'border: solid Blue 1px',
    id: 'family',
    renderTo: Ext.getBody(),
    store: store,
    requires: [
        'Ext.ux.exporter.Exporter'
    ],
    columns: columnList,
    columnLines: true,
    width: Ext.getBody().getViewSize().width,
    height: Ext.getBody().getViewSize().height,
   bbar: 
        xtype: 'pagingtoolbar',
        pageSize: 2,
        store: store,
        displayInfo: true,
        plugins: new Ext.ux.ProgressBarPager()
    ,
    dockedItems:[
    
                xtype: 'toolbar',
                dock: 'top',
                items: [
                    
                        xtype: 'exporterbutton',
                        text: 'exrpot data'
                    
                ]
            
    ]

);

【讨论】:

我已经编辑了我的代码......我尝试了你所说的......我包含了你提到的所有文件......但是按下导出按钮......没有任何反应......我收到一条错误消息“Uncaught TypeError: col.getXType is not a function”........我正在制作一个独立的 html 文件并使用 EXTJS 4.2 它对我有用。你能提供小提琴吗?如果它不起作用,则不需要。我只需要完整的代码来跟踪问题 这是小提琴fiddle.sencha.com/#fiddle/160l的链接。我没有将存储库包含到应用程序目录中(我不知道该怎么做:()请包含那些存储库文件.... . PS:我认为exporter的代码只能在ext js 5.1及以上版本中工作......它不适用于4.2......请找到我的问题的解决方案 github.com/iwiznia/Ext.ux.Exporter sencha.com/forum/showthread.php?136598-Export-store-to-Excel ....请检查这是否可以帮助我获得所需的功能 抱歉,工作忙。今天已经太晚了(这里:))。明天我会尽力帮助你

以上是关于ExtJS 4.2 将网格数据导出到可下载的 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 extjs 4.2 中将数据从商店设置到具有网格的表单面板

ExtJS 4.2网格单元格编辑如何将列值与组合显示值绑定

如何在具有嵌套数据的网格中设置组合框值? Extjs 4.2 Mvc

EXTJS 4.2 网格的分页

如何通过可下载的链接将文本保存为 .txt 文件?

从 JavaScript 创建一个可下载的附件?