프로그래밍Front-End

[Vue3&TypeScript] dataTable의 exportCSV() 사용시 엑셀 한글 깨짐 현상 해결 방법

PrimeVue의 DataTable의 exportCSV() 메소드를 사용해서 엑셀파일 다운로드 기능이 구현되어 있는데, .csv이고, 한글이 깨지는 문제가 발생한다.

const dt = ref();  //dataTable ref="dt"
const exportCSV = async () => {
  const allData = await getUserCSV(); // 전체 데이터 가져오기
  dt.value.exportCSV({}, allData);
};

exprotCSV()로 처리시 해결방법이 없는 것 같다. ChatGPT가 알려주는 방식으로 4가지를 시도해보았으나 한글 깨짐 문제 발생은 여전하다. 그래서 gpt가 알려준 100%확실한 방법은 xlsx로 다운로드 하는 방식이다.


xlsx로 엑셀 다운로드 처리 방법

1. npm 를 이용하여 xlsx 설치

npm install xlsx


2. 심플한 예제 코드

import * as XLSX from 'xlsx';

const exportExcel = async () => {
  const allData = await selectCSV();
  const ws = XLSX.utils.json_to_sheet(allData);
  const wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
  XLSX.writeFile(wb, 'export.xlsx'); // Excel 파일로 저장
};


3. 공통함수로 분리하여 여러곳에서 사용가능하도록 처리

import * as XLSX from 'xlsx';


/**
 * Excel(.xlsx)로 내려받기
 *
 * @param data - 내보낼 원본 데이터 배열
 * @param headerMap - DB 필드명 → 사용자 표시명 맵핑
 * @param filename - 저장할 파일명 (확장자 제외)
 * @param sheetName - 시트 이름 (기본: 'Sheet1')
 */
export function exportToExcel<T extends Record<string, any>>(
  data: T[],
  headerMap: Record<keyof T, string>,
  filename: string,
  sheetName = 'Sheet1'
) {

  // if (!data || data.length === 0) {
  //   alert("내보낼 데이터가 없습니다.");
  //   return;
  // }

  // 키 순서 보장
  const keys = Object.keys(headerMap) as (keyof T)[];
  const headers = keys.map(k => headerMap[k]);

  // 데이터 변환
  const rows = data.map(row => keys.map(k => row[k]));

  // 시트 생성 (2차원 배열로)
  const worksheet = XLSX.utils.aoa_to_sheet([headers, ...rows]);

  // 컬럼 너비 자동 조정
  worksheet['!cols'] = headers.map((header, idx) => ({
    wch: Math.max(
      header.length,
      ...rows.map(row => String(row[idx] ?? '').length)
    ) + 2,
  }));

  // 워크북 생성 및 저장
  const workbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
  XLSX.writeFile(workbook, `${filename}.xlsx`);
}

4. 사용방법

const exportExcel = async () => {
  const allData = await selectContractCSV();

  if (!allData || allData.length === 0) {
    alert("내보낼 데이터가 없습니다.");
    return;
  }

  // 헤더 맵핑용 객체(Object) 생성 : TypeScript에서는 Record<string, string>
  const headerMap = {
    seq: '순번',
    contractNo: '계약번호',
    tradeNm: '계약명',
    customerNm: '계약자명',
    status: '계약상태',
    contractDt: '계약일',
    saveDate: '등록일',
  };

  exportToExcel(allData, headerMap, "다운로드명");
};

위 내용을 공통함수로 구현할 수 있다.

[Vue3&TypeScript] json타입의 데이터 객체를 Map구조로 변환시키는 공통함수 만들기 (convertColsToHeaderMap)

error: Content is protected !!