마이의 개발 블로그

[NodeJS] 엑셀 업로드 기능의 구현 (xlsx 모듈 활용) 본문

개발지식/Node.js

[NodeJS] 엑셀 업로드 기능의 구현 (xlsx 모듈 활용)

개발자마이 2022. 11. 8. 18:47
반응형

배경

백오피스를 만들다보면 컨텐츠들의 정보를 한데 모아 대량으로 업로드해야하는 상황이 생기기도 한다.

나는 대체로 많이 사용하는 excel과 xlsx 모듈 중 xlsx 모듈을 선택하여 사용하였고, ExpressJS에서의 예시를 일부 제시하려고 한다.

xlsx 모듈을 활용한 엑셀 업로드 기능 구현 순서

1. 터미널에서 npm install xlsx 입력

npm install xlsx

2. 사용하고자 하는 파일에서 require

const xlsx = require('xlsx');

3. 파일 읽어오기 (필요 시 가공 및 변환하기)

//파일 첨부 여부 점검
if(!req.files || !req.files.excel_file){
    res.status(400).json({
        message: '엑셀 파일을 첨부해주세요.'
    });
    return;
}

//엑셀 파일 읽기 후 json 객체 변환
const excelFilePath = req.files.excel_file[0].path;				
const excelFile = xlsx.readFile(excelFilePath);
const sheetName = excelFile.SheetNames[0];                      // 첫 번째 시트명
const firstSheet = excelFile.Sheets[sheetName];                 // 첫 번째 시트 가져오기
const excelToJson = xlsx.utils.sheet_to_json(firstSheet);       // json 배열로 변환

//파일 삭제
fs.unlinkSync(excelFilePath);
  • 프론트단에서 업로드 되는 파일 키값을 excel_file로 명명함
  • excelFilePath은 단일 엑셀 파일이 업로드되는 경우라 excel_file의 0번째 path만 가져옴
  • 엑셀 파일의 첫 번째 시트만 활용함
  • 나의 경우 가져온 데이터를 활용하여 기존에 작성된 업로드 API를 호출해야하는 상황이어서 sheet_to_json 메서드를 활용하여 json객체로 변환함
  • 데이터 가공 및 변환이 끝난 파일은 삭제함

4. 읽어온 데이터 업로드하기 (별도 기능)

발견한 것들

1. 셀당 글자 수 제한

  • 엑셀에서는 한 셀에 작성할 수 있는 글자 수가 32,767자로 제한되어 이를 넘어가는 텍스트를 DB에 넣고싶을 경우 엑셀 이외의 방법(직접 or 외부 파일)을 활용해야 한다.

2. 이미지 관련

  • 엑셀에서는 이미지를 셀 단위로 할당하지 않고, 위치를 기준으로 배치만 시켜주기 때문에 한 줄(row)에 해당하는 이미지를 별도로 불러올 수 없다.
  • CDN 활용, 이미지 별도 저장의 방식으로 문제를 해결할 수 있다.
반응형
Comments