AngularJS中使用js-xlsx将Excel导入ui-grid的实现疑问
解决ui-grid填充Excel解析后JSON数据的问题
嘿,刚接触这些库的时候踩点坑太正常了!其实把解析好的Excel数据放到ui-grid里超级简单,核心就是利用ui-grid的data属性绑定数据源,我一步步给你讲清楚:
核心逻辑
ui-grid的gridOptions.data属性就是用来绑定展示数据数组的,你已经用XLSX.utils.sheet_to_row_object_array把Excel转成了格式匹配的JSON数组(也就是excelData),直接把这个数组赋值给$scope.samplesGridOptions.data就行。不过要注意一个关键细节:FileReader的回调是异步操作,不在Angular的上下文里,所以赋值后需要手动触发Angular的视图更新。
修改你的代码
把你ParseExcelDataAndSave函数里注释的那部分替换成下面的代码:
if (jsonData.length > 0) { // 直接将解析后的Excel数据赋值给ui-grid的数据源 $scope.samplesGridOptions.data = excelData; // 因为FileReader是异步操作,通知Angular更新视图 $scope.$apply(); // 可选:同步更新你之前定义的virtualSampleList变量 $scope.virtualSampleList = excelData; $scope.Message = "数据导入成功!"; } else { $scope.Message = "No data found"; }
关键注意事项
- 列名必须匹配:要确保Excel表格里的列标题和你
columnDefs里的field属性完全一致(大小写敏感)。比如你grid里的field是externalID,那Excel里对应的列标题也得是externalID;如果Excel里是"External ID"这种带空格的名称,需要手动做字段映射,示例如下:
// 假设Excel列名是"External ID"、"APEX Lot"、"Chamber Name",映射成grid需要的字段 var mappedData = excelData.map(item => { return { externalID: item["External ID"], apexLotNum: item["APEX Lot"], chamberName: item["Chamber Name"] }; }); // 用映射后的数据赋值 $scope.samplesGridOptions.data = mappedData; $scope.$apply();
为什么需要$scope.$apply():FileReader的
onload是浏览器原生的异步事件,Angular的脏检查机制不会自动监听这个事件,所以必须调用$scope.$apply()来告诉Angular数据已经更新,需要刷新视图。如果不加这一步,你可能会发现数据已经赋值成功,但grid里还是没显示内容。grid配置小优化:你之前在
onRegisterApi里给data赋值了$scope.virtualSampleList,其实这一步可以移到配置外面,或者直接在导入时覆盖,不影响功能,只是逻辑会更清晰。
这样修改后,你点击导入Excel文件,解析完成后数据就会自动显示在ui-grid里啦!
内容的提问来源于stack exchange,提问作者trx
相关产品推荐
相关产品推荐

