2019. 07. 21 수정


이번 글에서는 Node.js에서 엑셀 파일을 parser 하는 방법에 대해 알아보도록 하겠습니다.


엑셀 파일을 읽어들여 parser 하는 모듈이 많이 있는데, 이 중에서 저는 excel 모듈과 xlsx 모듈을 사용해서 구현하려고 합니다.

이 모듈을 사용하면, 엑셀 파일의 각 Cell을 JS 코드로 다룰 수 있게 됩니다.


두 모듈의 차이점은 다음과 같습니다.

  • excel 모듈 ( 깃헙 )
    • 비동기 방식으로 동작
    • 2차원 배열이 반환
  • xlsx 모듈 ( 깃헙 )
    • 기본적으로 동기적인 방법을 사용하지만 비동기 방식으로 설정 가능
    • json 객체로 반환
    • 셀 파일을 writing까지 할 수 있고, excel 모듈보다 활성화가 잘 된 오픈소스

두 모듈은 취향에 따라 선택하시면 되고, 저는 excel모듈이 더 간단하므로 이 모듈을 중심으로 소개한 뒤에 xlsx모듈을 다루도록 하겠습니다.





1. excel 모듈

1) 준비 작업

먼저 excel 모듈을 설치합니다.

# npm install excel


*** error ***

설치가 안된다면, python 시스템 변수가 path로 등록되어 있어야 합니다.



다음으로 excel 모듈을 사용하기 위해서, 테스트를 진행할 엑셀 파일이 있어야 합니다.



학교 시간표를 예제로 작성했고, 엑셀파일의 이름은 nodeexcel.xlsx 으로 저장하도록 하겠습니다.

excel 모듈은 xlsx 확장자만 지원한다고 하니, xlsx 확장자 파일 이여야 합니다.



그리고 나서 이 파일을 프로젝트 내의 public 폴더로 옮깁니다.


이것으로 준비 작업은 끝났습니다!





2) 엑셀 파일을 parsing하는 라우터 함수 추가 ( excel 모듈 )

먼저 간단하게 테스트할 목적으로 /routes/index.js에서 엑셀을 읽고, 그 데이터들을 json으로 응답하는 라우터 함수를 작성하도록 하겠습니다.

const express = require('express');
const router = express.Router();
const parseXlsx = require("excel");

router.get("/excelShow", function(req,res,next){
parseXlsx(__dirname + "/../public/nodeexcel.xlsx", function(err,data){
res.json(data)
})
})

module.exports = router;


먼저 excel 모듈을 require하여 불러옵니다.

excel 모듈이 무엇을 반환하는지 확인하기 위해, /node_modules/excel/excelParser.js 파일을 열어보았습니다.



보시는 바와 같이 excel 모듈은 함수를 반환하기 때문에, parseXlsx() 함수를 호출하여 모듈을 사용할 수 있습니다.

  • 첫 번째 인자는 엑셀 파일의 경로
  • 두 번째 인자는 파일을 파싱 할 sheet 번호 ( 생략하면 기본 값으로 첫 번째 시트 )
  • 세 번째 인자는 콜백 함수를 넘겨주면 됩니다.


라우터 함수에서 각 매개변수에 맞게 인자를 넘겨주었습니다.

그러면 콜백 함수로 엑셀 파일의 데이터가 배열의 배열 형태( 2차원 배열 )로 전달되는데 이를 data 변수로 받습니다.



excel 모듈의 깃헙을 보시면 array of arrays로 반환 한다고 되어있습니다.

즉, 엑셀 전체를 row( 행 )로 나눠서 배열을 생성하고, 각 row를 column( 열 )으로 나눠 배열의 요소에 할당합니다.

작성한 엑셀 파일과 반환 되는 결과를 비교하면 쉽게 이해할 수 있을 것입니다.



이제 서버를 실행시키고 브라우저에서 http://localhost:3000/excelshow 를 요청해보세요!

그러면 아래와 같이 2차원 배열로 엑셀 파일의 모든 데이터가 파싱된 것을 확인할 수 있습니다.







2. xlsx 모듈

다음으로 xlsx 모듈에 대해 알아보도록 하겠습니다.


1) 엑셀 파일을 parsing하는 라우터 함수 추가

xlsx모듈은 여러 기능을 제공하는 만큼 사용 방법도 조금 복잡합니다.

우선 xlsx 모듈을 설치합니다.

# npm install xlsx




깃헙에서 사용법을 보니 xlsx모듈을 require하고, readFile() 메서드를 호출하면 된다고 합니다.



간단한 테스트를 위해 /excel 경로로 요청했을 때, 어떤 식으로 excel 데이터를 다룰 수 있을지 보도록 하겠습니다.

/routes/index.js

const XLSX = require("xlsx");

router.get("/excel", function(req,res,next){
let workbook = XLSX.readFile(__dirname + "/../public/nodeexcel.xlsx")
let worksheet = workbook.Sheets["Sheet1"]
res.json(worksheet)
})



결과는 위의 사진과 같이 각 Cell이 객체의 프로퍼티로써 표현됩니다.

프로퍼티로 표시된 t,v,r,h,w 는 옵션으로써 여기를 참고하시면 자세히 나와있습니다.





3. sequelize seed와 함께 활용하기

일반적으로 엑셀 파일은 정적인 데이터로 많이 활용됩니다.

그래서 엑셀 데이터를 저장할 때, 브라우저 요청을 통해 엑셀 데이터를 저장하는 것보다 DB의 Seed를 활용하여 서버가 실행됐을 때 자동으로 데이터를 저장하는 것이 좋은 방법입니다.

Sequelize에서는 seed를 통해 이를 처리할 수 있습니다. ( 참고 )


xlsx 모듈을 이용하여 어떻게 Seed를 작성할 수 있는지 코드만 살펴보도록 하겠습니다.

우선 seed 파일을 생성하여, 아래와 같이 코드를 작성하도록 하겠습니다.

# sequelize seed:generate --name test
'use strict';
let XLSX = require('xlsx');

module.exports = {
up: (queryInterface, Sequelize) => {
let workbook = XLSX.readFile(__dirname + '/../public/test.xlsx');
let worksheet = workbook.Sheets["Sheet1"];

let datas = [];
// 행의갯수만큼 반복 , 열의갯수만큼 알파벳추가
for(let i = 1; i <= 12; i++){
let obj = {
lecName: worksheet["A" + i].w,
lecProfName: worksheet["B" + i].w,
lecNumber: worksheet["C" + i].w,
lecCollege: worksheet["D" + i].w,
lecCategory: worksheet["E" + i].w,
createdAt: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, ''),
updatedAt: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')
}
datas.push(obj);
}

return queryInterface.bulkInsert('lecs', datas, {});
},

down: (queryInterface, Sequelize) => {
return queryInterface.bulkDelete('lecs', null, {});
}
};

sequelize로 seed하는 방법에 대해서는 위의 링크를 참고해주시고, 여기서는 xlsx 모듈을 어떻게 활용할 수 있을지만 보도록 하겠습니다.

  • 현재 엑셀파일은 A1 ~ E12 까지 Cell에 데이터가 저장되어 있습니다.
    • 즉, 행은 1 ~ 12행 , 열은 A ~ E열이 존재합니다.
  • 모든 cell에 접근하기 위해서는 반복문을 12번 수행하여, worksheet 객체의 속성으로 A + i , B + i , .... 와 같이 i가 증가하면서 모든 cell에 접근할 수 있습니다.





이상으로 exce l모듈과 xlsx 모듈을 활용하여 excel parser에 대해 알아보았습니다.

  • excel 모듈의 도움으로 매우 간단하게 엑셀을 parsing 할 수 있고,
  • xlsx 모듈을 통해 여러 기능을 사용할 수 있습니다.

그 이후부터는 원하는 방식으로 데이터를 활용하시면 될 것이고, 추가적인 API는 깃헙 페이지에서 소개하지 않으므로 라이브러리를 직접 확인해보시는게 좋을 것 같습니다.