You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FileReader未进入onload函数,Excel导入KendoGrid追加数据失败

Excel导入KendoGrid无法进入FileReader.onload及数据追加问题

我需要实现Excel文件导入KendoGrid并完成数据追加:比如表格原有4行数据,Excel工作表有2行,导入后总计应为7行。但当前代码根本无法进入fileReader的onload函数,另外试过一篇教程的代码但看不懂。我的代码如下:

$("#fileInput").on("change", function (e) {
    var fileInput = e.target;
    var files = fileInput.files;

    if (files.length > 0) {
        var fileName = files[0].name;
        var fileReader = new FileReader();

// 从此处开始代码失效

fileReader.onload = function (event) {
            var data = event.target.result;

            // 使用XLSX库解析Excel内容
            var workbook = XLSX.read(data, { type: "binary" });
            var sheet = workbook.Sheets[workbook.SheetNames[0]];
            var rows = XLSX.utils.sheet_to_json(sheet, { header: 1 });
            var grid = $("#grid").data("kendoGrid");
            var griddataSource = grid.dataSource._data;

            // 假设Excel结构与Grid schema匹配
            for (var i = 1; i < rows.length; i++) {
                var row = rows[i];
                var dataItem = {
                    ProductID: row[0],
                    ProductName: row[1],
                    Price: row[2],
                };

                // 向Grid数据源添加新数据项
                grid.dataSource.add(dataItem);
            }
            $("#grid").data("kendoGrid").dataSource.data([]);
            $("#grid").data("kendoGrid").dataSource.data([griddataSource]);

            // 刷新Grid以显示变更
            grid.refresh();
            
        };
        // 以二进制字符串读取Excel文件内容
        fileReader.readAsBinaryString(files[0]);
    }
});

问题排查与修复方案

1. 解决onload不触发的核心问题

readAsBinaryString已被浏览器废弃,部分环境下会导致读取失败,同时缺少错误监听无法定位问题。修改方案:

  • 添加错误/中断监听,捕获读取异常
  • 改用readAsArrayBuffer读取文件,再转换为XLSX支持的二进制字符串

2. 修复数据追加逻辑错误

原代码中先清空数据源,再把原数据数组作为单个元素传入data(),这会导致数据结构混乱。正确的追加逻辑是保留原数据,直接添加新数据,或合并原数据与新数据后重新设置。

修正后的完整代码

$("#fileInput").on("change", function (e) {
    var fileInput = e.target;
    var files = fileInput.files;

    if (files.length > 0) {
        var fileReader = new FileReader();

        // 添加错误监听,定位读取问题
        fileReader.onerror = function(err) {
            console.error("文件读取错误:", err);
            alert("文件读取失败,请检查文件是否损坏或格式正确");
        };

        fileReader.onabort = function() {
            console.log("文件读取被中断");
        };

        fileReader.onload = function (event) {
            // 将ArrayBuffer转换为二进制字符串
            var data = new Uint8Array(event.target.result);
            var binaryStr = "";
            for (var i = 0; i < data.length; i++) {
                binaryStr += String.fromCharCode(data[i]);
            }

            // 使用XLSX库解析Excel内容
            var workbook = XLSX.read(binaryStr, { type: "binary" });
            var sheet = workbook.Sheets[workbook.SheetNames[0]];
            var rows = XLSX.utils.sheet_to_json(sheet, { header: 1 });
            var grid = $("#grid").data("kendoGrid");
            var dataSource = grid.dataSource;

            // 跳过表头(i从1开始),追加新数据
            for (var i = 1; i < rows.length; i++) {
                var row = rows[i];
                // 确保Excel行数据不为空
                if (row.length > 0) {
                    var dataItem = {
                        ProductID: row[0],
                        ProductName: row[1],
                        Price: row[2],
                    };
                    dataSource.add(dataItem);
                }
            }

            // 刷新Grid(add方法后会自动触发刷新,此步可省略,保险起见保留)
            grid.refresh();
        };

        // 以ArrayBuffer方式读取文件
        fileReader.readAsArrayBuffer(files[0]);
    }
});

关键说明

  • 错误监听:可以快速定位文件损坏、格式不支持等问题
  • 读取方式替换:readAsArrayBuffer是当前标准的文件读取方式,兼容性更好
  • 数据追加优化:dataSource.add()会自动将新数据添加到现有数据集中,无需手动清空再赋值,避免数据结构错误

内容的提问来源于stack exchange,提问作者Muskan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:57:46