const XLSX = require('xlsx'); // อ่านไฟล์ Excel const excel = XLSX.readFile('input.xlsx'); const sheet = excel.Sheets[excel.SheetNames[0]]; const data = XLSX.utils.sheet_to_json(sheet); // รวมยอดงบประมาณตาม "แหล่งงบประมาณ" const summary = {}; // ฟังก์ชันลบตัวเลขและจุดนำหน้า เช่น "33.เงินรายได้" → "เงินรายได้" const cleanSource = (text) => { if (!text) return ''; return text.toString().replace(/^\d+\.\s*/, '').trim(); }; // รวมงบประมาณ data.forEach(row => { const rawSource = row['แหล่งงบประมาณ']; // ชื่อคอลัมน์ใน Excel const source = cleanSource(rawSource); const budget = Number(row['งบประมาณ']) || 0; if (!source) return; // ข้ามแถวที่ไม่มีแหล่งงบประมาณ if (!summary[source]) summary[source] = 0; summary[source] += budget; }); // รวมยอดทั้งหมด let grandTotal = 0; Object.values(summary).forEach(total => (grandTotal += total)); // ฟังก์ชัน format ตัวเลขแบบมี comma + ทศนิยม 2 ตำแหน่ง const formatNumber = (num) => { return num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }; // แปลงกลับเป็น array สำหรับ export const result = Object.entries(summary).map(([source, total]) => ({ 'แหล่งงบประมาณ': source, 'รวมงบประมาณ': formatNumber(total) })); // เพิ่มแถวสุดท้าย “รวมทั้งหมด” result.push({ 'แหล่งงบประมาณ': 'รวมทั้งหมด', 'รวมงบประมาณ': formatNumber(grandTotal) }); // เขียนเป็นไฟล์ Excel ใหม่ const newSheet = XLSX.utils.json_to_sheet(result); const newBook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(newBook, newSheet, 'Summary'); XLSX.writeFile(newBook, 'output.xlsx'); console.log('✅ สรุปตามแหล่งงบประมาณเสร็จแล้ว → output.xlsx');