const sqlite3 = require('sqlite3').verbose(); const ExcelJS = require('exceljs'); async function exportData() { const db = new sqlite3.Database('database.sqlite'); const workbook = new ExcelJS.Workbook(); // выгрузка подъездов await new Promise((resolve, reject) => { db.all(` SELECT e.id as entrance_id, e.entrance_number as entrance_title, h.number as house_number, h.title as house_title FROM entrance e JOIN house h ON e.house_id = h.id `, async (err, entrances) => { if (err) return reject(err); for (const entrance of entrances) { let title = String(entrance.house_title) .replace('вул. ', '') .replace('Проспект ', ''); const sheet = workbook.addWorksheet( `${title} ${entrance.house_number} ( П. ${entrance.entrance_title + 1} )` ); sheet.columns = [ { header: 'ID', key: 'id', width: 10 }, { header: 'Вістник / Група', key: 'name', width: 30 }, { header: 'Початок', key: 'start', width: 20 }, { header: 'Кінець', key: 'end', width: 20 } ]; sheet.getColumn('start').numFmt = 'dd.mm.yyyy'; sheet.getColumn('end').numFmt = 'dd.mm.yyyy'; await new Promise((resolve2, reject2) => { db.all(` SELECT id, name, date_start, date_end, group_id FROM entrance_history WHERE entrance_id = ? `, [entrance.entrance_id], (err, rows) => { if (err) return reject2(err); rows.forEach(row => { const startDate = row.date_start ? new Date(row.date_start) : null; const endDate = row.date_end ? new Date(row.date_end) : null; let name = row.name; if (row.name === 'Групова') { name = `${row.name} (${row.group_id})`; } sheet.addRow({ id: row.id, name, start: startDate, end: endDate }); }); resolve2(); }); }); } resolve(); }); }); // выгрузка участков await new Promise((resolve, reject) => { db.all(` SELECT homestead.id as homestead_id, homestead.number as homestead_number, homestead.title as homestead_title FROM homestead `, async (err, homesteads) => { if (err) return reject(err); for (const homestead of homesteads) { const sheet = workbook.addWorksheet(`${homestead.homestead_title} ${homestead.homestead_number}`); sheet.columns = [ { header: 'ID', key: 'id', width: 10 }, { header: 'Вістник / Група', key: 'name', width: 30 }, { header: 'Початок', key: 'start', width: 20 }, { header: 'Кінець', key: 'end', width: 20 } ]; sheet.getColumn('start').numFmt = 'dd.mm.yyyy'; sheet.getColumn('end').numFmt = 'dd.mm.yyyy'; await new Promise((resolve2, reject2) => { db.all(` SELECT id, name, date_start, date_end, group_id FROM homestead_history WHERE homestead_id = ? `, [homestead.homestead_id], (err, rows) => { if (err) return reject2(err); rows.forEach(row => { const startDate = row.date_start ? new Date(row.date_start) : null; const endDate = row.date_end ? new Date(row.date_end) : null; let name = row.name; if (row.name === 'Групова') { name = `${row.name} (${row.group_id})`; } sheet.addRow({ id: row.id, name, start: startDate, end: endDate }); }); resolve2(); }); }); } resolve(); }); }); // сохраняем один раз await workbook.xlsx.writeFile('Території.xlsx'); console.log('Файл создан: entrances.xlsx'); db.close(); } exportData();