diff options
Diffstat (limited to 'lib/items-tech/table/ship/item-excel-template.tsx')
| -rw-r--r-- | lib/items-tech/table/ship/item-excel-template.tsx | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/lib/items-tech/table/ship/item-excel-template.tsx b/lib/items-tech/table/ship/item-excel-template.tsx new file mode 100644 index 00000000..127a1dea --- /dev/null +++ b/lib/items-tech/table/ship/item-excel-template.tsx @@ -0,0 +1,122 @@ +import * as ExcelJS from 'exceljs'; +import { saveAs } from "file-saver"; + +const SHIP_TYPES = ['A-MAX', 'S-MAX', 'LNGC', 'VLCC', 'CONT'] as const; + +/** + * 조선 아이템 데이터 가져오기를 위한 Excel 템플릿 파일 생성 및 다운로드 + */ +export async function exportItemTemplate() { + // 워크북 생성 + const workbook = new ExcelJS.Workbook(); + workbook.creator = 'Shipbuilding Item Management System'; + workbook.created = new Date(); + + // 워크시트 생성 + const worksheet = workbook.addWorksheet('조선 아이템'); + + // 컬럼 헤더 정의 및 스타일 적용 + worksheet.columns = [ + { header: '아이템 코드', key: 'itemCode', width: 15 }, + { header: '아이템 명', key: 'itemName', width: 30 }, + { header: '기능(공종)', key: 'workType', width: 15 }, + { header: '설명', key: 'description', width: 50 }, + ...SHIP_TYPES.map(type => ({ + header: type, + key: type, + width: 10 + })) + ]; + + // 헤더 스타일 적용 + const headerRow = worksheet.getRow(1); + headerRow.font = { bold: true }; + headerRow.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FFE0E0E0' } + }; + headerRow.alignment = { vertical: 'middle', horizontal: 'center' }; + + // 테두리 스타일 적용 + headerRow.eachCell((cell) => { + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + }); + + // 샘플 데이터 추가 + const sampleData = [ + { + itemCode: 'BG0001', + itemName: '샘플 아이템 1', + workType: '기장', + description: '이것은 샘플 아이템 1의 설명입니다.', + 'A-MAX': 'O', + 'S-MAX': 'O', + 'LNGC': 'O', + 'VLCC': 'X', + 'CONT': 'X' + }, + { + itemCode: 'BG0002', + itemName: '샘플 아이템 2', + workType: '전장', + description: '이것은 샘플 아이템 2의 설명입니다.', + 'A-MAX': 'O', + 'S-MAX': 'X', + 'LNGC': 'O', + 'VLCC': 'O', + 'CONT': 'X' + } + ]; + + // 데이터 행 추가 + sampleData.forEach(item => { + worksheet.addRow(item); + }); + + // 데이터 행 스타일 적용 + worksheet.eachRow((row, rowNumber) => { + if (rowNumber > 1) { // 헤더를 제외한 데이터 행 + row.eachCell((cell) => { + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + }); + } + }); + + // 워크시트 보호 (선택적) + worksheet.protect('', { + selectLockedCells: true, + selectUnlockedCells: true, + formatColumns: true, + formatRows: true, + insertColumns: false, + insertRows: true, + insertHyperlinks: false, + deleteColumns: false, + deleteRows: true, + sort: true, + autoFilter: true, + pivotTables: false + }); + + try { + // 워크북을 Blob으로 변환 + const buffer = await workbook.xlsx.writeBuffer(); + const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + saveAs(blob, 'shipbuilding-item-template.xlsx'); + return true; + } catch (error) { + console.error('Excel 템플릿 생성 오류:', error); + throw error; + } +}
\ No newline at end of file |
