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
댓글을 사용할 수 없습니다.