forked from sheetjs/docs.sheetjs.com
70 lines
2.6 KiB
TypeScript
70 lines
2.6 KiB
TypeScript
|
/* sheetjs (C) SheetJS -- https://sheetjs.com */
|
|||
|
|
|||
|
import './App.css'
|
|||
|
import { useCallback, useState } from '@lynx-js/react'
|
|||
|
import SheetJSLogo from './assets/SheetJS-logo.png';
|
|||
|
import { read, utils, WorkSheet } from 'xlsx';
|
|||
|
|
|||
|
const make_width = (ws: WorkSheet): number[] => {
|
|||
|
const aoa = utils.sheet_to_json(ws, { header: 1 }), res: number[] = [];
|
|||
|
aoa.forEach((r: any) => { r.forEach((c: any, C: any) => { res[C] = Math.max(res[C] || 60, String(c).length * 10); }); });
|
|||
|
for (let C = 0; C < res.length; ++C) if (!res[C]) res[C] = 60;
|
|||
|
return res;
|
|||
|
};
|
|||
|
|
|||
|
export function App() {
|
|||
|
const [data, setData] = useState<any[]>([
|
|||
|
"SheetJS".split(""),
|
|||
|
[5, 4, 3, 3, 7, 9, 5],
|
|||
|
[8, 6, 7, 5, 3, 0, 9]
|
|||
|
]);
|
|||
|
const [widths, setWidths] = useState<number[]>(Array.from({ length: 7 }, () => 20));
|
|||
|
|
|||
|
const importFile = useCallback(async () => {
|
|||
|
try {
|
|||
|
const ab = await (await fetch("https://docs.sheetjs.com/pres.numbers")).arrayBuffer();
|
|||
|
const wb = read(ab);
|
|||
|
|
|||
|
/* convert first worksheet to AOA */
|
|||
|
const wsname = wb.SheetNames[0];
|
|||
|
const ws = wb.Sheets[wsname];
|
|||
|
const data = utils.sheet_to_json(ws, { header: 1 });
|
|||
|
/* update state */
|
|||
|
setData(data);
|
|||
|
console.log(data);
|
|||
|
|
|||
|
setWidths(make_width(ws));
|
|||
|
} catch (err) {
|
|||
|
console.log("importFile Error", "Error " + ((err as any).message || err));
|
|||
|
}
|
|||
|
}, []);
|
|||
|
|
|||
|
return (
|
|||
|
<view className='App'>
|
|||
|
<text className="Title">
|
|||
|
<image className="Logo" src={SheetJSLogo} /> SheetJS × React Lynx
|
|||
|
</text>
|
|||
|
<view className="Button" bindtap={importFile}>
|
|||
|
<text>IMPORT DATA FROM A SPREADSHEET</text>
|
|||
|
</view>
|
|||
|
<text style={{ margin: '8px', fontWeight: '600'}}>Current Data</text>
|
|||
|
<view className='Table'>
|
|||
|
{data.map((row, rowIndex) => (
|
|||
|
<view key={`row-${rowIndex}`} className="Row">
|
|||
|
{Array.isArray(row) && row.map((cell, cellIndex) => (
|
|||
|
<view
|
|||
|
key={`cell-${rowIndex}-${cellIndex}`}
|
|||
|
className="Cell"
|
|||
|
style={{ width: `${widths[cellIndex]}px` }}
|
|||
|
>
|
|||
|
<text>{cell}</text>
|
|||
|
</view>
|
|||
|
))}
|
|||
|
</view>
|
|||
|
))}
|
|||
|
</view>
|
|||
|
<view style={{ flex: 1 }}></view>
|
|||
|
</view>
|
|||
|
)
|
|||
|
}
|