"use client"; import React, { FC } from "react"; import Image from "next/image"; import { useToast } from "@/hooks/use-toast"; import { toast as toastMessage } from "sonner"; import ExcelJS from "exceljs"; import { saveAs } from "file-saver"; import { Button } from "@/components/ui/button"; import { DataTableColumnJSON } from "./form-data-table-columns"; interface VarListDownloadBtnProps { columnsJSON: DataTableColumnJSON[]; formCode: string; } export const VarListDownloadBtn: FC = ({ columnsJSON, formCode, }) => { const { toast } = useToast(); const downloadReportVarList = async () => { try { // Create a new workbook const workbook = new ExcelJS.Workbook(); // 데이터 시트 생성 const worksheet = workbook.addWorksheet("Data"); // 유효성 검사용 숨김 시트 생성 const validationSheet = workbook.addWorksheet("ValidationData"); validationSheet.state = "hidden"; // 시트 숨김 처리 // 1. 데이터 시트에 헤더 추가 const headers = ["Table Column Label", "Report Variable"]; worksheet.addRow(headers); // 헤더 스타일 적용 const headerRow = worksheet.getRow(1); headerRow.font = { bold: true }; headerRow.alignment = { horizontal: "center" }; headerRow.eachCell((cell) => { cell.fill = { type: "pattern", pattern: "solid", fgColor: { argb: "FFCCCCCC" }, }; }); // 2. 데이터 행 추가 columnsJSON.forEach((row) => { const { displayLabel, label } = row; const labelConvert = label.replaceAll(" ", "_"); worksheet.addRow([displayLabel, labelConvert]); }); // 3. 컬럼 너비 자동 조정 headers.forEach((col, idx) => { const column = worksheet.getColumn(idx + 1); // 최적 너비 계산 let maxLength = col.length; columnsJSON.forEach((row) => { const valueKey = idx === 0 ? "displayLabel" : "label"; const value = row[valueKey]; if (value !== undefined && value !== null) { const valueLength = String(value).length; if (valueLength > maxLength) { maxLength = valueLength; } } }); // 너비 설정 (최소 10, 최대 50) column.width = Math.min(Math.max(maxLength + 2, 10), 50); }); const buffer = await workbook.xlsx.writeBuffer(); saveAs(new Blob([buffer]), `${formCode}_report_varible_list.xlsx`); toastMessage.success("Report Varible List File 다운로드 완료!"); } catch (err) { console.log(err); toast({ title: "Error", description: "Variable List 파일을 찾을 수가 없습니다.", variant: "destructive", }); } }; return ( ); };