summaryrefslogtreecommitdiff
path: root/lib/items-tech/table/ship/item-excel-template.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/items-tech/table/ship/item-excel-template.tsx')
-rw-r--r--lib/items-tech/table/ship/item-excel-template.tsx122
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