You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Web中使用react-native-fs+xlsx导出Excel报错求助

解决React Native Web环境导出Excel时的「Cannot read properties of undefined (reading 'RNFSFileTypeRegular')」错误

错误原因

react-native-fs是仅针对React Native原生平台(iOS/Android)开发的文件系统模块,它依赖原生端API实现文件读写操作。在Chrome、Edge等浏览器环境(即React Native Web场景)中,不存在对应的原生支持,RNFS模块无法完成初始化,导致访问RNFSFileTypeRegular这类内部属性时触发undefined错误。

解决方案

针对Web环境,无需依赖RNFS,直接利用浏览器原生的Blob和下载API实现Excel文件导出即可。如果项目需要同时兼容原生和Web平台,可通过平台判断分别处理逻辑。

1. 仅Web环境的修正代码

import React from "react";
import xlsx from 'xlsx';

export const exportDataToExcel = (fileName, data, headerTitle) => {
    // 创建工作簿和工作表
    let wb = xlsx.utils.book_new();
    let ws = xlsx.utils.json_to_sheet(data, { header: [headerTitle] });
    xlsx.utils.book_append_sheet(wb, ws, fileName);
    
    // 生成Excel二进制数据(修正原代码的xslx拼写错误)
    const wbout = xlsx.write(wb, { type: 'binary', bookType: "xlsx" });

    // 将二进制字符串转换为ArrayBuffer
    function s2ab(s) {
        const buf = new ArrayBuffer(s.length);
        const view = new Uint8Array(buf);
        for (let i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
        return buf;
    }

    // 创建Blob并触发浏览器下载
    const blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = `${fileName}.xlsx`; // 修正原代码未定义的formName变量
    document.body.appendChild(a);
    a.click();
    
    // 清理临时资源
    setTimeout(() => {
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }, 100);
};

2. 兼容原生+Web平台的代码

如果项目同时运行在原生和Web环境,可通过Platform模块区分处理:

import React from "react";
import { Platform } from "react-native";
import xlsx from 'xlsx';

// 仅在原生平台加载RNFS
let RNFS;
if (Platform.OS !== 'web') {
    RNFS = require('react-native-fs');
}

export const exportDataToExcel = (fileName, data, headerTitle) => {
    let wb = xlsx.utils.book_new();
    let ws = xlsx.utils.json_to_sheet(data, { header: [headerTitle] });
    xlsx.utils.book_append_sheet(wb, ws, fileName);
    const wbout = xlsx.write(wb, { type: 'binary', bookType: "xlsx" });

    if (Platform.OS !== 'web') {
        // 原生平台使用RNFS写入文件
        RNFS.writeFile(RNFS.ExternalStorageDirectoryPath + `/${fileName}.xlsx`, wbout, 'ascii')
            .then(() => console.log(`Excel文件创建成功`))
            .catch(e => console.error(`Excel文件创建失败`, e));
    } else {
        // Web平台触发浏览器下载
        function s2ab(s) {
            const buf = new ArrayBuffer(s.length);
            const view = new Uint8Array(buf);
            for (let i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
            return buf;
        }
        const blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = `${fileName}.xlsx`;
        document.body.appendChild(a);
        a.click();
        
        setTimeout(() => {
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        }, 100);
    }
};

原代码的其他问题修正

  • 拼写错误:xslx.write应改为xlsx.write
  • 未定义变量:formName替换为传入的fileName参数,避免变量未定义报错

内容的提问来源于stack exchange,提问作者tara Narimani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:02:44