react native(expo)加载excel文件并解析用于展示

1.引入相关库:

npx expo add expo-document-picker 文件选择器
npx expo add @ant-design/react-native 适用于react native的ant UI组件库
npx expo add expo-file-system 文件访问
npx expo add xlsx 解析excel

2.新建从本地选择并加载excel文件的帮助类:

import * as DocumentPicker from "expo-document-picker";
import LogUtil from "./log_util";
import { Toast } from '@ant-design/react-native';
import * as FileSystem from "expo-file-system";
import {Buffer} from "buffer";
import XLSX from "xlsx";

export async function pickExcelFile() {
    try {
        let result = await DocumentPicker.getDocumentAsync({
            // type: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
            type: '*/*',
            copyToCacheDirectory: true,
            multiple: false
        });
        LogUtil.log(`getDocumentAsync = ${JSON.stringify(result)}`);
        if (result.canceled === false) {
            let assets = result.assets[0];
            if (assets.mimeType !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                && assets.mimeType !== 'application/vnd.ms-excel') {
                Toast.info('请选择excel文件')
                return [];
            } else {
                const fileContents = await FileSystem.readAsStringAsync(assets.uri, {encoding: 'base64'});
                LogUtil.log(`readAsStringAsync = ${fileContents}`);
                const binaryData = Buffer.from(fileContents, 'base64');
                const workbook = XLSX.read(binaryData, {type: 'buffer'});
                const sheetNameList = workbook.SheetNames;
                const firstSheetName = sheetNameList[0];
                const worksheet = workbook.Sheets[firstSheetName];
                const data = XLSX.utils.sheet_to_json(worksheet, {header: 1});
                LogUtil.log('excel数据 = ', data);
                return data;
            }
        }
    } catch (error) {
        return [];
    }
}

3.使用:

async function openDocumentPicker(coinType) {
    const data = await pickExcelFile()
    const members = parseDataArray(data, coinType);
    LogUtil.log(i18n.t("CheckRoute.CheckPaymentBatch.ExcelData") +' = ', members);
    return members;
}

function parseDataArray(data, coinType) {
    let dataArray = [];
    for (let i = 0; i < data.length; i++) {
        const itemValue = data[i];
        // 取excel中的指定字段
        let amount = itemValue[0], toaddress = itemValue[1], coin_type = coinType, remark = itemValue[2] ?? i18n.t("none");
        dataArray.push({
            no: i, amount, toaddress, coin_type, remark,
        });
    }
    return dataArray;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值