summaryrefslogtreecommitdiff
path: root/lib/items-tech/table/ship/item-excel-template.tsx
blob: f6b20b6d477c2e9a10bdb4b2f7dd552aac1bc55f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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: 'workType', width: 15 },
    { header: '아이템 리스트', key: 'itemList', width: 30 },
    ...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', 
      workType: '기장',
      itemList: '아이템 리스트 내용',
      'A-MAX': 'O',
      'S-MAX': 'O',
      'LNGC': 'O',
      'VLCC': ' ',
      'CONT': ' '
    },
    { 
      itemCode: 'BG0002', 
      workType: '전장',
      itemList: '아이템 리스트 내용 2',
      'A-MAX': 'O',
      'S-MAX': ' ',
      'LNGC': 'O',
      'VLCC': 'O',
      'CONT': ' '
    },
    { 
      itemCode: 'BG0003', 
      workType: '선실',
      itemList: '선종 없는 아이템',
      'A-MAX': ' ',
      'S-MAX': ' ',
      'LNGC': ' ',
      'VLCC': ' ',
      'CONT': ' '
    }
  ];

  // 데이터 행 추가
  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;
  }
}