개요
- 엑셀 다룰때 여러가지 모듈을 사용했으나 가장 믿을만한! 가장 확실한 모듈을 찾음!
- 사용법은 링크 아래 문서(사용법 문서정리 정말 잘 되어 있음) 가보면 정말 잘 나와 있다.
- 기본 사용법을 익히기
- 추가 응용 기능 NodeJS Express 다운로드 기능 구현
npm & git
$ npm install exceljs --save
- git
https://github.com/guyonroche/exceljs
- star 3115 / fork 420 날짜 2018-11-28 기준
- 어마어마 함.
기본 사용법
- 구동 흐름은 다음으로 생각됨
Excel.WorkBook() -> workBook.addSheet -> sheet.columns 추가 ->
sheet.addRow 추가 -> workBook.xlsx.write or 다른 작업 수행
파일 읽기
-
엑셀 파일 읽기 기능
-
예시 데이터: test2.xlsx
- sheet01
- sheet02
- sheet01
-
수행 코드
const Excel = require('exceljs');
const workbook = new Excel.Workbook();
/// 파일 읽기 수행
workbook.xlsx.readFile('test2.xlsx').then(function(){
// 읽어 작업 하는 객체는 workbook 으로 진행하면 됨
});
파일 생성
- 엑셀 파일 생성 기능
const Excel = require('exceljs');
- 파일 매칭시 JSON으로 연결되는 부분이 중요했다.
- 다른 여타 excel
파일 쓰기
-
json 배열을 엑셀 파일 정적 파일 출력
-
수행 코드
const Excel = require('exceljs');
- 주의할 내용은 sheet.columns 배열 처리 부분으로 배열 자체를 한번 대입 시켜줄때 내부 헤더 객체로 변환됨.
- sheet.columns = [] 후에 sheet.columns.push({…}) 형태로 추가할 경우 제대로 헤더가 작동하지 않는 경우가 있음
- 이때 발생하는 에러
(node:9828) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: column.equivalentTo is not a function
(node:9828) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.- 요런 에러가 발생함… 알아내는데 한참 걸렸다는거…
- 혹시나 해서 디버깅도구 이용하여 미리 헤더 배열을 완성시킨 상태에서 대입 시킨 것과 미리 배열 할당한 상태에서 push 를 이용해 동적으로 추가하는 경우 비교한 결과
- 전자의 경우가 제대로 내부 객체(추가 필드가 정의됨)로 완성된다는 것. //TODO
응용 기능 구현
NodeJS Express 서버 구현하는 사람이라면 아무래도 ExcelJS 패키지 기능을 이용하여 요청/응답에 맞는 서비스를 제공하고 싶을 것이다. 특히 업무 중에 엑셀 다운로드 API 를 구현해야할 필요가 있었다.
서버에서 다운로드 기능 구현(파일 쓰기/저장 없이) 구현해 보자!
자료 수집
- Express에 의한 엑셀 다운로드 기능 구현
- 웹상에서 node express 다운로드 구현 가능성에 대해 단서 를 찾음
- 아래 코드 조각, 출처: How to download on client? 깃허브 이슈 에서 gtskaushik 님의 코멘트
// Create the workbook and populate it with data... res.attachment("test.xlsx") workbook.xlsx.write(res) .then(function() { res.end() });
- 여기서 res.attachment 는 어떤 내용인가?
res.attachment([filename]), res.download(path, [filename], [callback]) : 클라이언트에게 파일을 표시하지 말고 다운로드 받으라고 전송함. filename을 주면 파일 이름이 명시되며, res.attachment는 헤더만 설정하므로 다운로드를 위한 node 코드가 따로 필요핟.
출처: http://luckyyowu.tistory.com/346 - 핵심은! res 객체에 workbook 객체의 write 메소드를 쓰는 부분
- 파일 출력 대상을 res로 하는 패턴!!! stream 처리!
- 그리고 마무리는 res.end()
구현
- 위 단서 코드를 이용하여 실제 다운로드 API 에 사용되도록 구현해 본다.
- rest api 구현하는 Node.js + Express 기본 패턴에서
- TBD
결론
- TBD…
댓글 없음:
댓글 쓰기