Nof2030 / worker.js
stat2025's picture
Upload 4 files
f3bf432 verified
/* 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) });
}
};