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;
}