Excel 파일(.xlsx)을 JSON 형식으로 변환하기

Express.js 서버로 업로드 한 Excel 파일을 JSON 형식으로 변환하기


재무제표, 수익률 데이터, 용돈 데이터 등등...

종종 Excel로 기록된 데이터를 Node.js에서 다뤄야 할 경우가 있습니다.


Express.js로 구현된 웹 페이지에 사용자가 엑셀 파일을 업로드하면, 해당 파일을 읽어들여 json 형식으로 돌려주는 예제를 공유합니다.


사전 준비

1. Dependencies: 아래 명령어를 이용해 필요한 패키지를 설치합니다.

- multiparty: multipart/form-data 형식으로 전송된 파일을 좀 더 편리하게 다룰 수 있도록 도와줍니다.

- xlsx: Excel 파일을 다룰 수 있도록 도와줍니다.

npm i --save express http body-parser multiparty xlsx


실습

1. Sample Code: 아래 코드를 app.js로 저장합니다.

const express = require('express');
const http = require('http');
const bodyParser = require('body-parser');
const multiparty = require('multiparty');
const xlsx = require('xlsx');

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    limit: '150mb',
    extended: false,
}));

app.get('/', (req, res, next) => {
    let contents = '';
    contents += '<html><body>';
    contents += '   <form action="/" method="POST" enctype="multipart/form-data">';
    contents += '       <input type="file" name="xlsx" />';
    contents += '       <input type="submit" />';
    contents += '   </form>';
    contents += '</body></html>';

    res.send(contents);
});

app.post('/', (req, res, next) => {
    const resData = {};

    const form = new multiparty.Form({
        autoFiles: true,
    });

    form.on('file', (name, file) => {
        const workbook = xlsx.readFile(file.path);
        const sheetnames = Object.keys(workbook.Sheets);

        let i = sheetnames.length;

        while (i--) {
            const sheetname = sheetnames[i];
            resData[sheetname] = xlsx.utils.sheet_to_json(workbook.Sheets[sheetname]);
        }
    });

    form.on('close', () => {
        res.send(resData);
    });

    form.parse(req);
});

http.createServer(app).listen(3000, () => {
    console.log('HTTP server listening on port ' + 3000);
});

app.js:30: multiparty를 이용해 Form 데이터를 처리합니다. 이 때, autoFiles를 true로 지정하면 POST 방식으로 전달된 파일만 처리하도록 할 수 있습니다.

app.js:35: xlsx를 이용해 전달된 파일을 객체로 변환합니다. 이 객체에는 파일 정보, 테마, 시트별 데이터 등 다양한 정보가 담겨있습니다.

app.js:40~43: 시트별 내용을 결과 객체에 담습니다. 이 때 42행에 있는 xlsx.utils.sheet_to_json()이 시트의 내용을 JSON 객체로 변환하는 작업을 수행합니다.


2. 터미널에서 아래 명령어를 입력하면 서버가 실행됩니다.

node app.js


3. 테스트 할 엑셀 파일을 생성합니다.


4. 실행된 서버에 접속하면 File을 업로드 할 수 있는 페이지가 표시됩니다.


5. 테스트 파일을 선택하고 업로드하면 JSON 변환 결과가 표시됩니다.


6. 테스트 파일과 비교해보면 올바르게 파싱된 것을 확인할 수 있습니다.


GitHub

본 강의에 사용한 코드는 GitHub에 공개되어 있습니다.

https://github.com/jETA-Kor/examples


참고 문서

node.js에서 multipary와 multer를 이용한 파일 업로드 하기: http://bcho.tistory.com/1078

npm - multiparty: https://www.npmjs.com/package/multiparty

npm - xlsx: https://www.npmjs.com/package/xlsx