// /js/report-viewer-export.js /** * 주어진 데이터를 CSV 형식의 문자열로 변환합니다. * @param {object} reportData - 요약 및 작업자별 데이터 * @returns {string} - CSV 형식의 문자열 */ function convertToCsv(reportData) { let csvContent = "\uFEFF"; // UTF-8 BOM csvContent += "작업자명,프로젝트명,작업유형,작업상태,에러유형,작업시간,입력자\n"; reportData.workers.forEach(worker => { worker.entries.forEach(entry => { const row = [ worker.worker_name, entry.project_name, entry.work_type_name, entry.work_status_name, entry.error_type_name, entry.work_hours, entry.created_by_name ].map(field => `"${String(field || '').replace(/"/g, '""')}"`).join(','); csvContent += row + "\n"; }); }); return csvContent; } /** * 가공된 보고서 데이터를 CSV 파일로 다운로드합니다. * @param {object|null} reportData - UI에 표시된 가공된 데이터 */ export function exportToExcel(reportData) { if (!reportData || !reportData.workers || reportData.workers.length === 0) { alert('내보낼 데이터가 없습니다.'); return; } try { const csv = convertToCsv(reportData); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); const url = URL.createObjectURL(blob); const fileName = `작업보고서_${reportData.summary.date}.csv`; link.setAttribute('href', url); link.setAttribute('download', fileName); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); } catch (error) { console.error('Excel 내보내기 실패:', error); alert('Excel 파일을 생성하는 중 오류가 발생했습니다.'); } } /** * 현재 페이지의 인쇄 기능을 호출합니다. */ export function printReport() { try { window.print(); } catch (error) { console.error('인쇄 실패:', error); alert('인쇄 중 오류가 발생했습니다.'); } }