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
130
131
132
133
134
135
136
137
|
import * as ExcelJS from 'exceljs';
import { saveAs } from "file-saver";
/**
* 기술영업 벤더 가능 아이템 Import를 위한 Excel 템플릿 파일 생성 및 다운로드
*/
export async function exportTechVendorPossibleItemsTemplate() {
// 워크북 생성
const workbook = new ExcelJS.Workbook();
workbook.creator = 'Tech Vendor Possible Items Management System';
workbook.created = new Date();
// 워크시트 생성
const worksheet = workbook.addWorksheet('기술영업 벤더 가능 아이템');
// 컬럼 헤더 정의 및 스타일 적용
worksheet.columns = [
{ header: '아이템코드', key: 'itemCode', width: 20 },
{ header: '벤더코드', key: 'vendorCode', width: 15 },
{ header: '벤더이메일', key: 'vendorEmail', width: 30 },
];
// 헤더 스타일 적용
const headerRow = worksheet.getRow(1);
headerRow.eachCell((cell) => {
cell.fill = {
type: 'pattern',
pattern: 'solid',
fgColor: { argb: 'FFE6F3FF' }
};
cell.font = {
bold: true,
color: { argb: 'FF1F4E79' }
};
cell.border = {
top: { style: 'thin' },
left: { style: 'thin' },
bottom: { style: 'thin' },
right: { style: 'thin' }
};
cell.alignment = {
vertical: 'middle',
horizontal: 'center'
};
});
// 샘플 데이터 추가
const sampleData = [
{ itemCode: 'ITEM001', vendorCode: 'V001', vendorEmail: '' },
{ itemCode: 'ITEM001', vendorCode: 'V002', vendorEmail: '' },
{ itemCode: 'ITEM002', vendorCode: '', vendorEmail: 'vendor@example.com' },
{ itemCode: 'ITEM002', vendorCode: 'V002', vendorEmail: '' },
{ itemCode: 'ITEM004', vendorCode: '', vendorEmail: 'vendor2@example.com' },
];
sampleData.forEach((data) => {
const row = worksheet.addRow(data);
row.eachCell((cell) => {
cell.border = {
top: { style: 'thin' },
left: { style: 'thin' },
bottom: { style: 'thin' },
right: { style: 'thin' }
};
cell.alignment = {
vertical: 'middle',
horizontal: 'left'
};
});
});
// 안내사항 워크시트 생성
const guideSheet = workbook.addWorksheet('사용 가이드');
const guideData = [
['기술영업 벤더 가능 아이템 Import 템플릿', ''],
['', ''],
['📋 사용 방법:', ''],
['1. "기술영업 벤더 가능 아이템" 시트에 데이터를 입력하세요', ''],
['2. 벤더 식별: 벤더코드 또는 벤더이메일 중 하나는 반드시 입력', ''],
[' • 벤더코드가 있으면 벤더코드를 우선 사용', ''],
[' • 벤더코드가 없으면 벤더이메일로 벤더 검색', ''],
['3. 아이템코드는 실제 존재하는 아이템코드를 사용하세요', ''],
['4. 한 아이템코드에 여러 벤더를 매핑할 수 있습니다 (1:N 관계)', ''],
['5. 중복된 벤더-아이템 조합은 무시됩니다', ''],
['6. 파일 저장 후 시스템에서 업로드하세요', ''],
['', ''],
['⚠️ 중요 사항:', ''],
['- 벤더코드 또는 벤더이메일 중 하나는 반드시 필요', ''],
['- 벤더코드가 우선, 없으면 벤더이메일로 검색', ''],
['- 중복된 벤더-아이템 조합은 건너뜁니다', ''],
['- 오류가 있는 항목은 별도 파일로 다운로드됩니다', ''],
['- 빈 셀이 있으면 해당 행은 무시됩니다', ''],
['', ''],
['💡 팁:', ''],
['- 벤더코드만 존재하면 어떤 아이템코드든 입력 가능합니다', ''],
['- 아이템코드는 그대로 시스템에 저장됩니다', ''],
['', ''],
['📞 문의사항이 있으시면 시스템 관리자에게 연락하세요.', ''],
];
guideData.forEach((rowData, index) => {
const row = guideSheet.addRow(rowData);
if (index === 0) {
// 제목 스타일
row.getCell(1).font = { bold: true, size: 16, color: { argb: 'FF1F4E79' } };
} else if (rowData[0]?.includes(':')) {
// 섹션 제목 스타일
row.getCell(1).font = { bold: true, color: { argb: 'FF1F4E79' } };
} else if (rowData[0]?.includes('•') || rowData[0]?.includes('-')) {
// 리스트 아이템 스타일
row.getCell(1).font = { color: { argb: 'FF333333' } };
}
});
guideSheet.getColumn(1).width = 70;
guideSheet.getColumn(2).width = 20;
// 파일 생성 및 다운로드
try {
const buffer = await workbook.xlsx.writeBuffer();
const blob = new Blob([buffer], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
});
const fileName = `기술영업_벤더_가능_아이템_템플릿_${new Date().toISOString().split('T')[0]}.xlsx`;
saveAs(blob, fileName);
return { success: true };
} catch (error) {
console.error("Excel 템플릿 생성 중 오류:", error);
return {
success: false,
error: error instanceof Error ? error.message : "템플릿 생성 중 오류가 발생했습니다."
};
}
}
|