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