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