Nest

NestJs에서 간단하게 엑셀 다운로드 시키는 방법

YATTA! 2024. 4. 15. 18:00

ExcelJs의 npm 사이트에서 더 자세한 사항을 확인할 수 있습니다.

Javascript를 사용해 엑셀을 조작할 수 있는 라이브러리는 크게 두 가지가 있습니다. 외에도 다양하겠지만, 가장 많은 사람들이 사용하고 있는 라이브러리가요. ExcelJsSheetJs(xlsx)그 두 개 중 오늘은 ExcelJs를 알아보고, 실제로 엑셀 다운로드까지 구현 해볼 것입니다.

 

왜 ExcelJs인가

ExcelJs와 SheetJs를 비교해준 글이 있습니다. 만약 지금 어떤 라이브러리를 사용할지 고민 중인 분이 계시다면 추천하는 글입니다. Nodejs 엑셀 자동화 라이브러리 비교하기
일단 SheetJs가 ExcelJs보다 더 많이 쓰인다고 알고 있었습니다. github stars⭐️ 수만 봐도 11.8k < 33.5k로 차이가 나는 것을 볼 수 있습니다.
그럼에도 제가 ExcelJs를 선택한 이유는 짧고 빠르고 쉬울 것 같아서 입니다. 실제로 저는 함수 세 개를 이용해 빠르게 작업을 완료했습니다. 😮
npm install exceljs

 

간단히 엑셀 알기

exceljs를 사용하면 아무리 최소한을 사용하더라도 workbook, worksheet, column, row가 등장합니다. 개중 workbook과 worksheet는 생소할 수도 있어서 한 번 설명을 드리려고 합니다. workbook엑셀 파일이라고 보시면 됩니다. 첫 번째 사진의 상단을 보시면 '이것이 workbook 입니다'라는 엑셀 파일 이름을 볼 수 있습니다. workbook은 엑셀 파일 그 자체라고 보시면 됩니다. 그리고 sheet는 하단에 각 페이지를 말합니다. 실제로 엑셀을 써보면 아래 + 버튼을 누르면 Sheet1 이런식으로 생성되게 됩니다.

  • workbook

  • worksheet

 

함수 📖

workbook()

workbook을 생성합니다.

const workbook = new Excel.Workbook();

addWorksheet()

workSheet를 생성합니다.

const sheet = workbook.addWorksheet("name")

두 번째 필드에는 다양한 파라미터를 넣어서 시트를 커스텀 할 수 있습니다.

addRow()

💡 다양한 함수 및 속성은 여기서 확인할 수 있습니다. 색상이나 폰트도 바꿀 수 있고, table도 만들 수 있습니다.

 

실제 작성 코드

제가 하고자 했던 건 인터넷에 특정 url을 입력하면 입력에 맞추어 엑셀이 다운로드 되는 것이었습니다.

 

하나의 엑셀 파일(Workbook)에 네 개의 페이지(sheet)를 만들고, 각각 다른 내용을 넣고자 했습니다.

그래서 먼저 workbook을 만들고, sheet를 만드는 함수 네 개를 사용하였습니다.

 

아래 코드를 보시면 workbooke을 만들고 workbook에 sheet를 넣어주는 코드가 있습니다.

createSheetA()같은 함수에서는 넣고 싶은 내용으로 columns와 row를 채워주게 됩니다.

columns와 관련된 아이디어는 아래에서 확인 하실 수 있습니다.

import * as Excel from "exceljs";

async createWorkbook(res: Response...) {
    const workbook = new Excel.Workbook();
    /** Promise.all()을 사용하면 좋을 것입니다 */
    await this.createSheetA(workbook.addWorksheet("Sheet 이름 A"));
    await this.createSheetB(workbook.addWorksheet("Sheet 이름 B"));
    await this.createSheetC(workbook.addWorksheet("Sheet 이름 C"));
    await this.createSheetD(workbook.addWorksheet("Sheet 이름 D"));
    this.createExcel(res, workbook);
}

async createSheetA(sheet: Excel.Worksheet) {
    sheet.columns = [{
        header: '날짜',  
        key: 'date',  
        width: 10,  
    },  
    {  
        header: '이름',  
        key: 'name',  
        width: 10  
    }];

    /** for 문을 사용해 row를 넣습니다 */
    sheet.addRow({
        date: new Date(),
        name: "이름"
    })
}

공식 문서에서는 해당 부분에서 확인하실 수 있습니다.

 

아이디어 💡
읽으시는데 편안함을 위에 위 코드에는 반영하지 않았지만, 실제로는 columns 파일을 따로 빼서 사용하였습니다. 각 sheet 별로 다양하고 많은 컬럼들이 들어가는데 그걸 다 써주기엔 너무 길어지고 보기도 안 좋았습니다.
그래서 실제 코드는 sheet.columns = sheetAColumns로 무척 간결하게 작성되었습니다.

 

 

참고한 글 👏
Nodejs 엑셀 자동화 라이브러리 비교하기

'Nest' 카테고리의 다른 글

NestJS 토큰 검증 기초 of 기초: Guard와 Passport.js  (0) 2024.12.13