diff options
Diffstat (limited to 'lib/tech-vendor-possible-items/table/excel-template.tsx')
| -rw-r--r-- | lib/tech-vendor-possible-items/table/excel-template.tsx | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/lib/tech-vendor-possible-items/table/excel-template.tsx b/lib/tech-vendor-possible-items/table/excel-template.tsx new file mode 100644 index 00000000..70a7eddf --- /dev/null +++ b/lib/tech-vendor-possible-items/table/excel-template.tsx @@ -0,0 +1,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 : "템플릿 생성 중 오류가 발생했습니다."
+ };
+ }
+}
\ No newline at end of file |
