import * as XLSX from 'xlsx'; import { HardwareAsset, SoftwareAsset, SWUser, HardwareLog, MasterAssetData } from './state'; export async function parseExcel(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (e) => { try { const workbook = XLSX.read(e.target?.result, { type: 'binary' }); const data: MasterAssetData = { pc: [], server: [], storage: [], equip: [], mobile: [], subSw: [], permSw: [], swUsers: [], logs: [] }; workbook.SheetNames.forEach(sheetName => { const rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]) as any[]; if (sheetName === '개인PC') { rows.forEach(r => data.pc.push({ id: Math.random().toString(36).substring(2, 9), type: '개인PC', 자산번호: r['자산번호'] || '', 관리번호: r['관리번호'] || r['관리코드'] || '', 실사용조직: r['실사용조직'] || '', 모델명: r['모델명'] || '', OS: r['OS'] || '', CPU: r['CPU'] || '', RAM: r['RAM'] || '', SSD1: r['SSD1'] || '', SSD2: r['SSD2'] || '', HDD1: r['HDD1'] || '', IP주소: r['IP주소'] || '', HW사양: r['HW사양'] || '', 도입일: r['도입일'] || '', 구매가: r['구매가'] || r['금액'] || '', 비고: r['비고'] || '' })); } else if (sheetName === '서버') { rows.forEach(r => data.server.push({ id: Math.random().toString(36).substring(2, 9), type: '서버', 자산번호: r['자산번호'] || '', 관리번호: r['관리번호'] || r['관리코드'] || '', 서버용도: r['서버용도'] || r['용도'] || '', 상태: r['상태'] || r['운영단계'] || '', 실사용조직: r['실사용조직'] || r['사용조직'] || '', 관리조직: r['관리조직'] || '', 설치장소: r['설치장소'] || r['위치'] || '', 세부위치: r['세부위치'] || '', IP주소: r['IP주소'] || r['IP 주소 1'] || '', IP2: r['IP2'] || r['IP 주소 2'] || '', 원격방법: r['원격방법'] || r['원격접속'] || '', 서버ID: r['서버ID'] || '', 서버PW: r['서버PW'] || '', 모델명: r['모델명'] || '', OS: r['OS'] || '', CPU: r['CPU'] || '', RAM: r['RAM'] || '', SSD1: r['SSD1'] || r['Storage 1'] || '', SSD2: r['SSD2'] || r['Storage 2'] || '', 모니터링: r['모니터링'] || '', 비고: r['비고'] || '' })); } else if (sheetName === '스토리지') { rows.forEach(r => data.storage.push({ id: Math.random().toString(36).substring(2, 9), type: '스토리지', 자산번호: r['자산번호'] || '', 관리번호: r['관리번호'] || '', 모델명: r['모델명'] || '', 용량: r['용량'] || '', IP주소: r['IP주소'] || '', 도입일: r['도입일'] || '', 구매가: r['구매가'] || r['금액'] || '', 비고: r['비고'] || '' })); } else if (sheetName === '기타자산') { rows.forEach(r => data.equip.push({ id: Math.random().toString(36).substring(2, 9), type: '기타자산', 자산구분: r['자산구분'] || r['구분'] || '', 자산번호: r['자산번호'] || '', 관리번호: r['관리번호'] || '', 모델명: r['모델명'] || '', IP주소: r['IP주소'] || '', OS: r['OS'] || '', 도입일: r['도입일'] || '', 구매가: r['구매가'] || r['금액'] || '', 비고: r['비고'] || '' })); } else if (sheetName === '모바일') { rows.forEach(r => data.mobile.push({ id: Math.random().toString(36).substring(2, 9), type: '모바일', 자산번호: r['자산번호'] || '', 관리번호: r['관리번호'] || '', 모델명: r['모델명'] || '', 사용자: r['사용자'] || '', 도입일: r['도입일'] || '', 구매가: r['구매가'] || r['금액'] || '', 비고: r['비고'] || '' })); } else if (sheetName === '구독SW') { rows.forEach(r => data.subSw.push({ id: r['ID'] || Math.random().toString(36).substring(2, 9), type: '구독SW', 부서: r['부서'] || '', 자산번호: r['자산번호'] || '', 소프트웨어명: r['소프트웨어명'] || '', 구매일: r['구매일'] || '', 만료일: r['만료일'] || '', 금액: r['금액'] || '', 수량: parseInt(r['수량'] || '1', 10), 비고: r['비고'] || '' })); } else if (sheetName === '영구SW') { rows.forEach(r => data.permSw.push({ id: r['ID'] || Math.random().toString(36).substring(2, 9), type: '영구SW', 부서: r['부서'] || '', 자산번호: r['자산번호'] || '', 소프트웨어명: r['소프트웨어명'] || '', 구매일: r['구매일'] || '', 금액: r['금액'] || '', 수량: parseInt(r['수량'] || '1', 10), 비고: r['비고'] || '' })); } else if (sheetName === 'SW_사용현황') { rows.forEach(r => data.swUsers.push({ id: r['id'] || Math.random().toString(36).substring(2, 9), swId: r['swId'] || '', 부서: r['부서'] || '', 이름: r['이름'] || '', 직급: r['직급'] || '', 사번: r['사번'] || '', 사용기간: r['사용기간'] || '' })); } else if (sheetName === 'History') { rows.forEach(r => data.logs.push({ id: r['id'] || Math.random().toString(36).substring(2, 9), assetId: r['assetId'] || '', date: r['date'] || '', details: r['details'] || '', user: r['user'] || '관리자' })); } }); resolve(data); } catch (err) { reject(err); } }; reader.readAsBinaryString(file); }); } export function exportToExcel(data: any, fileName: string) { const wb = XLSX.utils.book_new(); // HW Tabs if (data.pc) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.pc), '개인PC'); if (data.server) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.server), '서버'); if (data.storage) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.storage), '스토리지'); if (data.equip) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.equip), '기타자산'); if (data.mobile) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.mobile), '모바일'); // SW Tabs if (data.subSw) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.subSw), '구독SW'); if (data.permSw) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.permSw), '영구SW'); if (data.swUsers) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.swUsers), 'SW_사용현황'); // Logs if (data.logs) XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data.logs), 'History'); XLSX.writeFile(wb, fileName); }