본문 바로가기
⭐project/인턴

[트러블슈팅] Excel 날짜 데이터 변환 과정 중 ""로 처리되는 문제 해결

by 킁킁잉 2024. 12. 21.

인턴 업무 중 데이터를 엑셀로 등록하는 기능을 개발하고 있다. 등록하는 데이터 중, 날짜를 처리하는 과정에서 많은 어려움을 겪었고, 문제를 해결한 방법을 기록해보려고 한다.

 

문제 상황

상품 일괄 등록을 위해 Excel 파일을 업로드하는 과정에서 날짜 데이터 처리 오류가 발생했다. 사용자가 Excel에 입력한 판매 시작일과 종료일이 시스템에서 처리될 때 의도하지 않은 날짜로 변경되는 현상이었다.

 

구체적인 문제 상황:

  1. Excel에 실제 입력한 데이터: 2024-11-15
  2. Excel에서 실제 저장된 형태: 45611
  3. 시스템 처리 후 : 빈 문자열("")
  4. 최종 API 전송 시: 현재 날짜 + 1년으로 자동 설정

이로 인해 판매자가 지정한 판매 기간이 아닌, 현재 날짜 기준으로 자동으로 기간이 설정되는 문제가 발생했다. 

 

원인 분석

우선 엑셀 날짜 표기에 대한 이해가 필요했다. 나는 2024-12-17 형식으로 작성했는데 왜 콘솔을 출력해보면 45611 형식으로 출력되는 것일까? 

 

이는 Excel의 날짜 처리 방식 때문에다. Excel은 날짜를 1900년 1월 1일부터의 일수로 기록한다. 

 

이런 Excel의 날짜저장 방식을 변환하는 로직에서 문제가 있었다.

 

해결 방안

Excel 날짜 변환 함수를 수정했다.

const convertExcelDate = (dateValue: any): string => {
  // 값이 없는 경우 처리
  if (!dateValue) return '';
  
  // Excel 날짜 숫자 처리
  if (typeof dateValue === 'number') {
    // 1900년 기준 날짜로 변환
    const millisecondsPerDay = 86400 * 1000;
    const date = new Date(Math.round((dateValue - 25569) * millisecondsPerDay));
    return date.toISOString();
  }
  
  return '';
};
  • 25569: excel과 javascript 날짜 기준일 차이를 보정하는 값
    • excel의 기준은 1900년 1월 1일, javascript의 기준은 1970년 1월 1일(Unix Timestamp) 
    • 1900년 1월 1일 ~ 1970년 1월 1일 간 일수 : 25569일이므로 이를 보정하는 값을 사용했다.
  • 86400 * 1000: 하루를 밀리초로 변환한 값
    • 86400: 하루의 초 단위값
    • 1000: 밀리초 단위로 변환
  • 변환 과정
    • Excel 기분일에서 Javascript 기준일로 보정
    • 일수를 밀리초로 변환
    • 밀리초 값으로 Javascript Date 객체 생성(new Date())
    • ISO 문자열 변환(.toISOString())

그리고, 매핑 로직도 수정했다.

const productRequestData = {
  // 변환된 날짜 사용, 없을 경우 기본값 설정
  sellingStartAt: item.sellingStartAt || new Date().toISOString(),
  sellingEndAt: item.sellingEndAt || new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString()
};

결과

로직을 수정하고 결과를 확인해보니, Excel에서날짜가 올바르게 변환되어 API로 전송되었다.


Excel 일괄 등록 기능을 개발하면서, Excel 데이터 형식의 예상치 못한 특이사항들로 인해 여러 어려움을 겪었다. 특히 날짜나 Boolean 값과 같은 특수한 데이터 타입 처리가 주요 과제였다. 

 

이번 기능 개발을 통해 엑셀 등록, 매핑, 다운로드 기능을 구현하면서 파일 처리에 대한 이해도를 높일 수 있었던 것 같다.