forked from sheetjs/docs.sheetjs.com
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { TableContainer, Table, TableRow, TableCell, TableBody, TableHead } from '@mui/material';
|
|
import { WorkBook, WorkSheet, read, utils, writeFileXLSX } from "xlsx";
|
|
import { useRef, useState, useEffect } from "react";
|
|
|
|
import './App.css'
|
|
|
|
interface President {
|
|
Name: string;
|
|
Index: number;
|
|
}
|
|
|
|
function App() {
|
|
const tbl = useRef<HTMLTableElement>(null);
|
|
const xport = () => {
|
|
const wb: WorkBook = utils.table_to_book(tbl.current);
|
|
writeFileXLSX(wb, "SheetJSMaterialUI.xlsx");
|
|
};
|
|
|
|
const [pres, setPres] = useState<President[]>([]);
|
|
useEffect(() => {
|
|
let active = true;
|
|
(async() => {
|
|
const ab: ArrayBuffer = await (await fetch("https://docs.sheetjs.com/pres.xlsx")).arrayBuffer();
|
|
const wb: WorkBook = read(ab);
|
|
const ws: WorkSheet = wb.Sheets[wb.SheetNames[0]];
|
|
const aoo: President[] = utils.sheet_to_json<President>(ws);
|
|
if(active) setPres(aoo);
|
|
})();
|
|
return () => { active = false };
|
|
}, []);
|
|
|
|
return ( <>
|
|
<button onClick={xport}>Export</button>
|
|
<TableContainer><Table ref={tbl}>
|
|
<TableHead><TableRow><TableCell>Name</TableCell><TableCell>Index</TableCell></TableRow></TableHead>
|
|
<TableBody>
|
|
{pres.map((row, idx) => (
|
|
<TableRow key={idx}>
|
|
<TableCell>{row.Name}</TableCell>
|
|
<TableCell>{row.Index}</TableCell>
|
|
</TableRow>
|
|
))}
|
|
</TableBody>
|
|
</Table></TableContainer>
|
|
</> );
|
|
}
|
|
|
|
export default App |