React antd ts 上传xlsx文件解析 报错 解决

456 阅读1分钟

React antd ts 上传xlsx文件解析 报错 TypeError: Failed to execute 'readAsBinaryString' on 'FileReader': parameter 1 is not of type 'Blob'.

image.png

之前是

fileReader.readAsBinaryString(file.fileList[0]);

百度谷歌得知是ant组件给原生文件外面又包了一层,所以其实.originFileObj 才是要解析的文件

所以改成

fileReader.readAsBinaryString(file.fileList[0].originFileObj);

就能正常解析xlsx文件啦

完整代码 先安装插件

yarn add xlsx

后面是在页面引入就可以了

import * as XLSX from 'xlsx';
...

const uploadChange = (file:any)=>{
        console.log(file)
        // 通过FileReader对象读取文件
        
        const fileReader = new FileReader();
        // 以二进制方式打开文件 file.fileList[0].originFileObj
        fileReader.readAsBinaryString(file.fileList[0].originFileObj);
        fileReader.onload = event => {
        try {
            const {result} = event.target;
            // 以二进制流方式读取得到整份excel表格对象
            const workbook = XLSX.read(result, {type: 'binary'});
            // 存储获取到的数据
            let data = {};
            // 遍历每张工作表进行读取(这里默认只读取第一张表)
            for(const sheet in workbook.Sheets) {
                let tempData = [];
                // esline-disable-next-line
                if(workbook.Sheets.hasOwnProperty(sheet)) {
                    // 利用 sheet_to_json 方法将 excel 转成 json 数据
                    console.log(sheet);
                    data[sheet] = tempData.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
                }
            }
            const excelData = data.Sheet1;
            const excelHeader = [];
            // 获取表头
            for(const headerAttr in excelData[0]) {
                const header = {
                    title: headerAttr,
                    dataIndex: headerAttr,
                    key: headerAttr
                };
                excelHeader.push(header);
            }
            // 最终获取到并且格式化后的 json 数据
            console.log(excelData);
            console.log(excelHeader);
          
        } catch(e) {
            // 这里可以抛出文件类型错误不正确的相关提示
            console.log(e);
            console.log('文件类型不正确!');
        }
        };
    }
    
...


<Dragger name="file" accept=".xls,.xlsx" maxCount={1} onChange={uploadChange}>
    <div className="upload-wrap">
        <img className="upload-icon" src="../../../assets/images/upload-icon.png" alt="" />
        <Button >选择文件</Button>
        <p className="upload-tip">
           可支持上传文件为:xls、slsx
        </p>
    </div>
</Dragger>