184 lines
7.9 KiB
TypeScript
184 lines
7.9 KiB
TypeScript
import * as XLSX from 'xlsx';
|
|
import { HardwareAsset, SoftwareAsset, SWUser, HardwareLog, MasterAssetData } from './state';
|
|
|
|
export async function parseExcel(file: File): Promise<MasterAssetData> {
|
|
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);
|
|
}
|