Ember中ember-file-upload结合xlsx解析Excel文件为空问题
解决ember-file-upload与xlsx包协同解析Excel的问题
你这明显是踩了几个工具包协同的坑:ember-file-upload的封装对象和原生File API的差异,加上xlsx解析参数不匹配,才导致onload事件没触发、解析结果全是空的。我来一步步帮你捋顺:
问题根源拆解
- ember-file-upload的File不是原生对象:它封装了原生File,提供了Promise风格的
readAsArrayBuffer()方法,但原生的onload/onloadstart事件根本不会触发——因为内部已经用Promise接管了读取流程,你绑定的事件完全没机会执行。 - xlsx解析逻辑错配:你把ArrayBuffer直接传给
XLSX.utils.sheet_to_csv()(这个方法要传Worksheet对象,不是原始数据),而且手动转binary字符串的步骤完全多余,xlsx本身就支持直接解析ArrayBuffer。
修正后的完整代码
// 直接用ember-file-upload的Promise方法处理文件读取 file.readAsArrayBuffer().then(function(arrayBuffer) { // 用xlsx直接解析ArrayBuffer,type指定为'array'即可 const workbook = XLSX.read(arrayBuffer, { type: 'array', cellDates: true, cellStyles: true }); // 先检查工作表是否存在 if (workbook.SheetNames.length === 0) { alert('Excel文件里没有工作表哦'); return; } const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; // 获取A1单元格的值 const desiredCell = worksheet['A1']; const desiredValue = desiredCell ? desiredCell.v : undefined; alert(`A1单元格的值:${desiredValue}`); // 转CSV(注意这里传的是worksheet对象,不是原始buffer) const csvData = XLSX.utils.sheet_to_csv(worksheet); alert(csvData); // 继续你的csv2geojson处理 csv2geojson.csv2geojson(csvData, function(err, jsondata) { if (err) { console.error('转GeoJSON出错:', err); return; } // 这里处理转换后的GeoJSON数据 }); }).catch(function(error) { alert('读取文件失败:' + error.message); console.error(error); });
关键注意事项
- 别用原生onload事件:ember-file-upload的File对象已经把读取逻辑封装成Promise了,直接用
.then()和.catch()处理就行,原生事件绑定完全无效。 - 匹配xlsx的type参数:传入ArrayBuffer时,
type必须设为'array',xlsx会自动处理二进制数据,不用手动转成binary字符串。 - sheet_to_csv的参数要对:这个方法接收的是从workbook里取出的Worksheet对象,不是原始的文件buffer,之前传buffer肯定会返回空内容。
调整后先测试A1单元格读取和CSV转换是否正常,没问题再继续后续的GeoJSON处理就ok了。
内容的提问来源于stack exchange,提问作者lildrizzle
相关产品推荐
相关产品推荐

