/* worker.js — يستقبل ArrayBuffer ويقرأ أول ورقة in: { type:'parse', buffer:ArrayBuffer } out: { type:'parsed', payload:{ rows, cols } } | { type:'error', error } */ self.importScripts('https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js'); self.onmessage = async (e)=>{ const { type, buffer } = e.data || {}; if (type !== 'parse' || !buffer) return; try { const wb = new ExcelJS.Workbook(); await wb.xlsx.load(new Uint8Array(buffer)); const ws = wb.worksheets[0]; if (!ws) { self.postMessage({ type:'parsed', payload:{ rows:[], cols:[] } }); return; } const rows = []; ws.eachRow({ includeEmpty:false }, (row, idx)=>{ if (idx === 1) return; // نتجاوز العناوين const obj = {}; row.eachCell({ includeEmpty:true }, (cell, cIdx)=>{ const letter = ws.getColumn(cIdx).letter || String.fromCharCode(64 + cIdx); const v = cell?.value; obj[letter] = (v && typeof v === 'object' && v.text != null) ? v.text : (v ?? ''); }); if (Object.values(obj).some(v => v != null && String(v).trim() !== '')) rows.push(obj); }); const colSet = new Set(); rows.forEach(r => Object.keys(r).forEach(k => colSet.add(k))); self.postMessage({ type:'parsed', payload:{ rows, cols:[...colSet] } }); } catch (err) { self.postMessage({ type:'error', error: 'فشل تحميل الملف: ' + (err?.message || err) }); } };