2023-07-23 21:01:30 +00:00
|
|
|
|
import React, { useState, type FC } from 'react';
|
|
|
|
|
import { SafeAreaView, ScrollView, StyleSheet, Text, TouchableHighlight, View, Alert } from 'react-native';
|
2023-05-11 21:28:29 +00:00
|
|
|
|
import { read, utils, version } from 'xlsx';
|
|
|
|
|
import { getEnforcing } from 'react-native/Libraries/TurboModule/TurboModuleRegistry';
|
|
|
|
|
const DocumentPicker = getEnforcing('DocumentPicker');
|
|
|
|
|
|
2023-07-23 21:01:30 +00:00
|
|
|
|
const App: FC = () => {
|
2023-05-11 21:28:29 +00:00
|
|
|
|
|
|
|
|
|
const [ aoa, setAoA ] = useState(["SheetJS".split(""), "5433795".split("")]);
|
2023-07-23 21:01:30 +00:00
|
|
|
|
const max_cols = aoa.reduce((acc,row) => Math.max(acc,row.length),1);
|
2023-05-11 21:28:29 +00:00
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<SafeAreaView style={styles.outer}>
|
2023-07-23 21:01:30 +00:00
|
|
|
|
<Text style={styles.title}>SheetJS × React Native MacOS {version}</Text>
|
2023-05-11 21:28:29 +00:00
|
|
|
|
<TouchableHighlight onPress={async() => {
|
|
|
|
|
try {
|
|
|
|
|
const b64 = await DocumentPicker.PickAndRead();
|
|
|
|
|
const wb = read(b64);
|
|
|
|
|
setAoA(utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { header: 1 } ));
|
2023-07-23 21:01:30 +00:00
|
|
|
|
} catch(err) { Alert.alert(`Read Error`, `${err instanceof Error ? err.message : err}`); }
|
2023-05-11 21:28:29 +00:00
|
|
|
|
}}><Text style={styles.button}>Click here to Open File!</Text></TouchableHighlight>
|
|
|
|
|
<ScrollView contentInsetAdjustmentBehavior="automatic">
|
2023-07-23 21:01:30 +00:00
|
|
|
|
<View style={styles.table}>{Array.from({length: aoa.length}, (_, R) => (
|
|
|
|
|
<View style={styles.row} key={R}>{Array.from({length: max_cols}, (_, C) => (
|
|
|
|
|
<View style={styles.cell} key={C}><Text>{String(aoa?.[R]?.[C]??"")}</Text></View>
|
2023-05-11 21:28:29 +00:00
|
|
|
|
))}</View>
|
|
|
|
|
))}</View>
|
|
|
|
|
</ScrollView>
|
|
|
|
|
</SafeAreaView>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const styles = StyleSheet.create({
|
|
|
|
|
cell: { flex: 4 },
|
|
|
|
|
row: { flexDirection: 'row', justifyContent: 'space-evenly', padding: 10, backgroundColor: 'white', },
|
|
|
|
|
table: { display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', },
|
|
|
|
|
outer: { marginTop: 32, paddingHorizontal: 24, },
|
|
|
|
|
title: { fontSize: 24, fontWeight: '600', },
|
|
|
|
|
button: { marginTop: 8, fontSize: 18, fontWeight: '400', },
|
|
|
|
|
});
|
|
|
|
|
|
2023-07-23 21:01:30 +00:00
|
|
|
|
export default App;
|