如何先收集Excel多Sheet数据再通过AJAX统一提交至服务器
解决方案
你只需要把AJAX请求从forEach循环内移到循环结束后,并确保数据收集逻辑正确即可。以下是修正后的代码及关键说明:
var ExcelToJSON = function () { this.parseExcel = function (file) { var reader = new FileReader(); reader.onload = function (e) { var data = e.target.result; var workbook = XLSX.read(data, { type: 'binary' }); var dataArray = []; // 遍历所有Sheet,统一收集数据到数组 workbook.SheetNames.forEach(function (sheetName) { var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]); // 直接推入解析后的对象数组,避免重复序列化 dataArray.push(XL_row_object); // 若服务器端要求接收字符串数组,替换为下面这行: // dataArray.push(JSON.stringify(XL_row_object)); }); // 所有Sheet数据收集完成后,发起单次AJAX请求 $.ajax({ url: "test2.aspx/InsertExcelGeo", type: "post", data: JSON.stringify({ dataArray: dataArray }), contentType: "application/json; charset=utf-8", dataType: "json", success: function (_data) { alert(_data.d); }, error: function(xhr, status, error) { // 新增错误处理,方便调试请求失败原因 console.error("提交失败:", error); alert("数据提交失败,请查看控制台日志"); } }); }; reader.onerror = function (ex) { console.log(ex); }; reader.readAsBinaryString(file); }; };
关键修改点
- AJAX请求位置调整:将请求代码从循环内移至
forEach结束后,确保所有Sheet数据都已存入dataArray再提交。 - 优化数据序列化逻辑:移除循环内的
JSON.stringify,直接推入解析后的对象数组,减少不必要的序列化操作。如果你的服务器端原本依赖字符串格式的数组,只需恢复dataArray.push(JSON.stringify(XL_row_object))即可。 - 增加错误处理:添加
error回调,便于排查请求失败的问题(比如服务器参数格式不匹配、网络异常等)。
同时需要确认服务器端的InsertExcelGeo方法已适配接收多Sheet数据的数组参数,确保参数结构和类型与前端提交的一致。
内容的提问来源于stack exchange,提问作者hey hej
相关产品推荐
相关产品推荐

