2018년 11월 29일 목요일

[Node.js] ExcelJS 엑셀 다루는 믿을만한 모듈 - 서버에서 다운로드 기능 구현(파일 쓰기 저장 없이) - TBD

[Node.js] ExcelJS 엑셀 다루는 믿을만한 모듈 - 서버에서 다운로드 기능 구현(파일 쓰기 저장 없이) - TBD

개요

  • 엑셀 다룰때 여러가지 모듈을 사용했으나 가장 믿을만한! 가장 확실한 모듈을 찾음!
  • 사용법은 링크 아래 문서(사용법 문서정리 정말 잘 되어 있음) 가보면 정말 잘 나와 있다.
  • 기본 사용법을 익히기
  • 추가 응용 기능 NodeJS Express 다운로드 기능 구현

npm & git

$ npm install exceljs --save

기본 사용법

  • 구동 흐름은 다음으로 생각됨

    Excel.WorkBook() -> workBook.addSheet -> sheet.columns 추가 ->
    sheet.addRow 추가 -> workBook.xlsx.write or 다른 작업 수행

파일 읽기

  • 엑셀 파일 읽기 기능

  • 예시 데이터: test2.xlsx

    • sheet01
      ex-sheet02
    • sheet02
      ex-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 다운로드 구현 가능성에 대해 단서 를 찾음
    // 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…

댓글 없음:

댓글 쓰기