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