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 : "템플릿 생성 중 오류가 발생했습니다." }; } }