React Native中不使用第三方包解析API返回的Excel数据的方法
React Native中不使用第三方包解析API返回的Excel数据的方法
嘿,我留意到你在React Native里折腾API返回的Excel文件解析,而且已经试过用xlsx+react-native-fs的组合了。既然你想尝试不依赖第三方包的方案,我来给你拆解下可行的思路——不过先提前说一句,手动解析Excel真的挺折腾的,只适合简单场景哦~
首先,不管哪种Excel格式,第一步都是从API拿到原始的二进制数据:
- 用
fetch或者axios发起请求时,一定要把responseType设为arraybuffer或者blob,这样才能拿到未处理的二进制内容。举个fetch的例子:const fetchExcel = async () => { try { const res = await fetch('你的API接口地址', { method: 'GET', headers: { // 按需加API要求的请求头,比如授权令牌之类的 }, responseType: 'arraybuffer' }); const buffer = await res.arrayBuffer(); // 接下来就可以针对不同格式处理这个buffer了 } catch (err) { console.error('拉取Excel数据失败:', err); } };
针对旧版.xls格式的手动解析
.xls是基于BIFF二进制规范的,结构相当复杂。如果你的Excel只有纯文本的简单表格(没有公式、样式、合并单元格),可以尝试把arraybuffer转成Uint8Array,然后根据BIFF的规范去定位工作表、行、列的偏移量,提取单元格内容。但说实话,这个工作量极大,稍微复杂点的表格就容易翻车,不太推荐除非你真的必须这么做。
针对.xlsx/.xlsm格式的手动解析
这两种格式本质上是压缩的ZIP包,里面藏着一堆XML文件。你可以按这个思路来:
- 解压ZIP包:不过手动写ZIP解压逻辑真的很麻烦,要是你的API返回的ZIP结构特别简单(没有加密、只有基础文件),可以尝试自己处理二进制里的ZIP标识和文件块,但这一步门槛很高。
- 读取工作表XML:解压后找到
xl/worksheets/sheet1.xml(第一个工作表的内容),然后解析这个XML里的单元格数据。比如用简单的正则匹配来提取行和单元格的值:
注意哦,这个方法只能处理纯文本单元格,遇到日期(XML里是序列化数字)、公式、合并单元格的话,还得额外写逻辑转换,非常繁琐。const parseSheetXml = (xmlStr) => { const tableData = []; // 匹配所有行标签 const rowList = xmlStr.match(/<row[^>]*>(.*?)<\/row>/g); if (rowList) { rowList.forEach(rowStr => { const rowData = []; // 匹配所有单元格标签 const cellList = rowStr.match(/<c[^>]*>(.*?)<\/c>/g); if (cellList) { cellList.forEach(cellStr => { // 提取单元格的实际值(<v>标签里的内容) const valueMatch = cellStr.match(/<v>(.*?)<\/v>/); rowData.push(valueMatch ? valueMatch[1] : ''); }); } tableData.push(rowData); }); } return tableData; };
最后给你提个实在的建议:如果不是有特殊限制,还是用成熟的第三方包更靠谱。你之前遇到的高严重性漏洞,可以试试升级xlsx的版本——比如运行npm update xlsx,说不定最新版本已经修复了漏洞。手动解析真的太耗精力了,很容易踩各种坑~
备注:内容来源于stack exchange,提问作者WeCan
相关产品推荐
相关产品推荐

