Excel导出时如何用JavaScript删除数组第n-1索引行?
解决导出Excel时出现HTML代码并删除最后一行的问题
你遇到的两个核心问题:导出的Excel混入HTML代码,以及无法动态删除数组最后一行(索引为rows.length - 1的行),咱们可以通过调整代码逻辑来解决:
修改后的完整代码
我在你的原有代码基础上,加入了删除最后一行的核心逻辑,同时优化了导出流程避免HTML内容混入:
$(function () { var exportFlag = false; var reportGrid = $(time.report.gridId); if (reportGrid.length > 0) { $(time.report.gridId).data("kendoGrid").bind("excelExport", function(e) { if (!exportFlag) { e.preventDefault(); exportFlag = true; // 延迟执行导出,确保所有修改操作生效 setTimeout(function() { e.sender.saveAsExcel(); }, 1000); } else { exportFlag = false; } }); } }); function onExcelExport(e) { setTimeout("location.reload(true);", 1000); e.sender.hideColumn("OutIp"); e.sender.hideColumn("InIp"); var sheet = e.workbook.sheets[0]; var rows = sheet.rows; // 核心逻辑:删除数组最后一行(索引为rows.length - 1) if (rows.length > 0) { rows.splice(rows.length - 1, 1); // 也可以用 rows.pop(); 效果一致,都是移除数组最后一个元素 } // 保留你原有的行样式、值转换逻辑 for (rowIdx = 0; rowIdx < rows.length; rowIdx++) { if (rows[rowIdx].type === "data") { cells = rows[rowIdx].cells; var color = "#ffffff"; if (cells[0].value === true) { color = "#ff0000"; } for (colIdx = sheet.freezePane.colSplit; colIdx < cells.length; colIdx++) { cell = cells[colIdx]; cell.background = color; if (colIdx === 4) { cell.value = cell.value.Hours + ":" + cell.value.Minutes; } else if (cell.value !== undefined && cell.value !== null && cell.value.Hours !== undefined) { cell.value = utcTimeToLocalTime(cell.value.Hours + ":" + cell.value.Minutes); } else if (cell.value !== undefined && cell.value !== null && cell.value === true) { cell.value = "Yes"; } else if (cell.value !== undefined && cell.value !== null && cell.value === false) { cell.value = "No"; } } } } }
关键修改说明
删除最后一行:拿到工作表的行数组后,直接用
rows.splice(rows.length - 1, 1)移除最后一行。加了rows.length > 0的判断,避免数组为空时抛出错误。如果你的最后一行是汇总行或非数据行,也可以先判断rows[rowIdx].type再删除,不过按你的需求,直接删除最后一个元素就可以。修复HTML代码问题:原代码在
excelExport事件中的处理逻辑有点混乱,我移除了不必要的变量,确保e.preventDefault()优先执行,避免默认导出流程提前触发导致修改没生效,这样生成的工作簿就不会混入HTML内容。保留原有业务逻辑:你之前的行样式设置、布尔值转文本、时间格式转换等逻辑都完整保留,只添加了删除最后一行的核心代码。
如果还有异常,可以检查两点:
- 确认
rows.length - 1对应的确实是你要删除的目标行(比如是否包含表头、汇总行等特殊行) - 确保
utcTimeToLocalTime函数能正常运行,不会因为报错中断导出流程
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

