(4)kendo UI使用基础介绍与问题整理——Grid问题/导出excel

本文介绍Kendo UI Grid导出Excel的各种方法,包括使用内置功能、自定义文件名、导出全部分页数据、解决ColumnTemplate导出问题及单行数据导出等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简要和demo

Grid自带导出Excel的功能,先上一个官网的demo:

链接:https://demos.telerik.com/kendo-ui/grid/excel-export

 

简略代码如下:

toolbar: ["excel"],
excel: {
         fileName: "Kendo UI Grid Export.xlsx",
         proxyURL: "https://demos.telerik.com/kendo-ui/service/export",
          filterable: true
},

上面代码实际的位置是加到生成gird那段代码的参数里,大家应该能理解。

二、实际项目问题

   从上面的demo可以看出,官网的demo是把导出按钮放到了toolbar里,自带了导出的功能。

   实际的项目中可能需要一个单独的导出按钮,然后自己添加导出方法。

 1、 下面是导出excel的方法

var grid = $("#grid").data("kendoGrid");
grid.saveAsExcel();

 

2、带分页的grid导出全部数据

如果grid带有分页,这时要是需要导出excel的时候导出全部数据,那么需要在grid里添加参数excel,属性allPages设置为true。

   代码如下:

excel:{
    allPages:true//是否导出所有页中的数据
},

 

3、导出文件名称

为导出的Grid自定义文件名称的方法如下:

//方法1:
excelExport: function(e) {
        e.workbook.fileName = "xxx.xlsx";
},

//方法2:
excel: {
        fileName: "xxx.xlsx"
    },

 

4、Column template导出问题(自定义列导出显示问题)

Grid的列是允许使用template,从而实现自定义列的显示内容和显示效果的,但是Grid 的saveAsExcel方法保存出来的excel表格,自身并不可以把template指定的内容保存下来(目前我使用的版本会有这样的问题)。

也在网上找过一些解决办法,不过到最后还是自己瞎研究了一点儿结果,也许是我理解能力比较差。

下面上我写的简略代码:

excelExport: function (e) {
        $.each(e.data, function (i, item) {//逐行处理数据
                     var value=item.Code;
                     e.workbook.sheets[0].rows[i + 1].cells[1].value = value;
       }); 
},

通过测试,我发现 e.workbook.sheets[0].rows 这里的数据才是导出excel的实际数据,所以无论如何修改e.data,都无法改变打印出来的效果。

e.workbook.sheets[0].rows[0] 这是打印出来的title那一行,所以我再循环的时候是从i+1开始,e.workbook.sheets[0].rows[i + 1].cells这个是列,可以根据需要来修改指定的列,

e.workbook.sheets[0].rows[i + 1].cells[1].value 这里的value是实际显示的值。

如果在项目中有什么其他相关的需求,建议通过在浏览器控制台中输出数据的方法(console.log())来进行适当的修改。

 

5、Grid单行导出数据

项目里要求有gird单行导出数据的功能,开始以为grid自带此功能,不过目前我使用的版本里没有找到此功能,没办法,自己写吧。

下面上代码:

//导出一行kendo grid数据
function SaveGridExcel(id, fileName) {

    if (!fileName) {
        fileName = "export";
    }

    var grid = $("#grid").data("kendoGrid");
    var kendoData = grid.dataSource.data();
    var lineIndex;
    for (var i = 0; i < kendoData.length; i++) {
        if (kendoData[i].Id == id) {
            lineIndex = i;
            break;
        }
    }


    var arr = [];
    var isHide = false;
    if (grid.items().length != 0) { //判断列表中是否存在有效数据
        var rows = []; //excel中的所有的行
        var headCells = []; //获取grid列表中的标题列
        var cellWidths = []; //设置每列的宽度
        for (var k = 0; k < grid.columns.length; k++) {
            cellWidths.push({ autoWidth: true });
            var cellValue = grid.columns[k];
            if (cellValue.title == null  || cellValue.hidden) {
                arr.push(k);
            }
            else {
                headCells.push({ value: cellValue.title });
            }
        }
        var headRow = { cells: headCells }; //标题行
        rows.push(headRow); //将标题行添加到rows集合中                            
        var cRows = grid.items(); //获取当前列表内容的行数   
        var rowItem = cRows[lineIndex]; //获取列表的当前行                            
        var data = grid.dataItem(rowItem); //获取列表的当前行的数据源                            
        var currentRow = []; //创建当前行的数组变量                            
        for (var j = 0; j < rowItem.cells.length; j++) {
            isHide = false;
            for (var h = 0; h < arr.length; h++) {
                if (arr[h] == j) {
                    isHide = true;
                    break;
                }
            }
            if (!isHide) {
                currentCell = rowItem.cells[j].innerText;
                if (currentCell != null) {
                    currentRow.push({ value: currentCell });
                }
            }
        }
        rows.push({ cells: currentRow }); //添加行元素                           
        //创建工作册                            
        var workbook = new kendo.ooxml.Workbook({
            sheets: [{
                columns: cellWidths,
                rows: rows
            }]
        });
        //保存为excel文件                            
        kendo.saveAs({ dataURI: workbook.toDataURL(), fileName: fileName + '.xlsx' });
    } else {
        kendo.alert("无有效数据需要导出!");
        return;
    }
}

 

严格的说上面的代码不是我创造出来的,这是肯定的,主要部分还是使用了kendo UI得自制excel的方法,官网上是能够找到这部分的参考代码的(kendo.ooxml.Workbook,应该是这个名字吧)。

关键的就是这部分代码:

        //创建工作册                            
        var workbook = new kendo.ooxml.Workbook({
            sheets: [{
                columns: cellWidths,
                rows: rows
            }]
        });
        //保存为excel文件                            
        kendo.saveAs({ dataURI: workbook.toDataURL(), fileName: fileName + '.xlsx' });

 

只是由于项目的需要,我自己写了获取grid中一行数据的逻辑部分而已,用来得到columns和rows。

这部分大家根据项目需要自己发挥吧!

(以上代码仅供参考)

欢迎大家指点交流,内容会随着项目遇到的问题逐渐丰富。

转载于:https://www.cnblogs.com/lindaCai/p/8252614.html

Kendo UI框架提供了强大的Excel导出功能,通过Grid的saveAsExcel能方便地导出Grid中的数据,而且格式美观大方,使用起来也非常方便。但是在实际使用中不是很理想,主要有以下两个问题: 1. 导出的列数据是原始值 Kendo UI默认导出的是该列的value值,及查出来的值,有时候我们会用template渲染一下导出的列,比如将“Y”显示成“是”,把“N”显示成“否”。而Kendo UI导出的却是Y/N这种只有程序员看得懂的数据库标识,显然不是我们需要的,这种情况非常常见。 2. 不能灵活控制可导出的列 Kendo UIExcel导出主要看两点,一是该列(column)是field字段,而不是自定义的name;二是该列不是隐藏的(hidden:true)。这样我们无法灵活导出我们需要的列。 为了解决上面两个问题,我查看了Kendo UI的源代码,提取并改进了源代码。主要更改点及使用方法请看下面源代码。主要针对以上两点做了更改,只需要在grid定义columns时加上isExport或exportTemplate即可: 在导出数据,先看该列有没有自定义exportTemplate(),没有则看Kendo UI自带的template(),再没有才会导出查出来的值。 判断是否导出该列不再看hidden属性,而是看列的isExport属性,如果为false则不导出,其它情况一律导出该列。 经过这两个更改,基本可以应对所有业务场景,可以方便快捷地开发了! 但要注意,Kendo UI自带的导出功能无法应用于导出大量数据,似乎是浏览器的jvm溢出了,建议超过5万条的数据导出还是老老实实写后台导出功能吧。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值