summaryrefslogtreecommitdiff
path: root/lib/tech-vendors/table/excel-template-download.tsx
blob: 65b880da4ec5356ad18e6923114e1c86ee001ddb (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
import * as ExcelJS from 'exceljs';
import { saveAs } from "file-saver";

// 벤더 타입 enum
const VENDOR_TYPES = ["조선", "해양TOP", "해양HULL"] as const;

/**
 * 기술영업 벤더 데이터 가져오기를 위한 Excel 템플릿 파일 생성 및 다운로드
 */
export async function exportTechVendorTemplate() {
  // 워크북 생성
  const workbook = new ExcelJS.Workbook();
  workbook.creator = 'Tech Vendor Management System';
  workbook.created = new Date();
  
  // 워크시트 생성
  const worksheet = workbook.addWorksheet('기술영업 벤더');

  // 컬럼 헤더 정의 및 스타일 적용
  worksheet.columns = [
    { header: '업체명', key: 'vendorName', width: 20 },
    { header: '이메일', key: 'email', width: 25 },
    { header: '사업자등록번호', key: 'taxId', width: 15 },
    { header: '벤더타입', key: 'techVendorType', width: 15 },
    { header: '주소', key: 'address', width: 30 },
    { header: '국가', key: 'country', width: 15 },
    { header: '전화번호', key: 'phone', width: 15 },
    { header: '웹사이트', key: 'website', width: 25 },
    { header: '아이템', key: 'items', width: 30 },
  ];

  // 헤더 스타일 적용
  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 = [
    { 
      vendorName: '샘플 업체 1',
      email: 'sample1@example.com',
      taxId: '123-45-67890',
      techVendorType: '조선',
      address: '서울시 강남구',
      country: '대한민국',
      phone: '02-1234-5678',
      website: 'https://example1.com',
      items: 'ITEM001,ITEM002'
    },
    { 
      vendorName: '샘플 업체 2',
      email: 'sample2@example.com',
      taxId: '234-56-78901',
      techVendorType: '해양TOP',
      address: '부산시 해운대구',
      country: '대한민국',
      phone: '051-234-5678',
      website: 'https://example2.com',
      items: 'ITEM003,ITEM004'
    }
  ];

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

  // 워크시트에 벤더 타입 관련 메모 추가
  const infoRow = worksheet.addRow(['벤더 타입 안내: ' + VENDOR_TYPES.join(', ')]);
  infoRow.font = { bold: true, color: { argb: 'FF0000FF' } };
  worksheet.mergeCells(`A${infoRow.number}:I${infoRow.number}`);

  // 워크시트 보호 (선택적)
  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, 'tech-vendor-template.xlsx');
    return true;
  } catch (error) {
    console.error('Excel 템플릿 생성 오류:', error);
    throw error;
  }
}