728x90
const Excel = require('exceljs');
const moment = require('moment');
const ExcelUtil = {
//headers 컬럼명
//keys 타입 (kay-value 형식의 key)
excelDownload : function(menu, data, headers, keys, res){
//파일이름에들어갈 오늘날짜를 위해서 데이트선언 ( 중복 방지는 덤 )
const currentDate = new Date();
//오늘날짜를 YYYY-MM-DD 로 선언하여 파일이름에 붙이기 위해서.
const currentDayFormat = currentDate.getFullYear()+"-"+
(currentDate.getMonth()+1)+"-"+
currentDate.getDate();
//exceljs 를써서 새로운 엑셀객체 생성
const workbook = new Excel.Workbook();
//해당객체의 시트를 생성하면서 이름을 정해준다.
const worksheet = workbook.addWorksheet('Test Excel Sheet');
//엑셀 헤더부분에 들어갈 첫줄데이터, 구분자로 되어있기때문에 받아서 다시 배열로 셋팅하는것.
headers = headers.split(',');
//데이터를 넣을때 헤더부분에 셋팅하게위해 키값을 선언하여 addrow 데이터의 json key값과 동일하게 선언해주면된다.
keys = keys.split(',');
//var fullData = JSON.parse(data);//page값으로 리턴되기때문에 전체데이터를 받아서 content 데이터를 따로 때주는작업을 진행
data = data.content;
//시트의 첫 헤더를 정해줄 데이터를 담을 json데이터
const columnsHeader = {
headerData: []
};
//위에서 ,구분자로 짤라서 담아놓은 배열의 사이즈만큼 반복하여 헤더데이터에 셋팅 셋팅값은 {header : --, key: -- 두가지는 필수값}
for(var i=0;i<headers.length;i++){
columnsHeader.headerData[i] = { header: headers[i], key: keys[i]};
}
//포문을 통해서 직접 셋팅하게되면 write 할시에 에러를 뱉어내기때문에 다른객체에 담아서 넣어줍니다.
worksheet.columns = columnsHeader.headerData;
//사용자데이터의 길이만큼 반복하여 엑셀시트의 row를 생성해줌.
for(var dataIndex = 0; dataIndex<data.length;dataIndex++){
var rows = {};//row데이터를 담아서 셋팅해줄 json데이터
//한개의 row데이터를 셋팅할때 json형식으로 셋팅하기때문에 헤더의 키와 맞춰주기위해서 키순서대로 반복
for(var keyIndex = 0; keyIndex<keys.length; keyIndex++){
if(keys[keyIndex]== 'test key'){
rows[keys[keyIndex]] = data[dataIndex].testData;
}
/**
* 이런식으로 key값과 data값을 맞춰주며 반복하고, 일일히 데이터 수정 가능하게끔 작성
*/
//1row당 키값을 전부셋팅했으면 시트에 추가해주는것.
worksheet.addRow(rows);
}
//엑셀시트을 생성하기위해서 헤더셋팅
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.setHeader("Content-Disposition", "attachment; filename=" + menu+currentDayFormat+".xlsx");//menu와 파일명을 동일하게 취급하여 파일명 = 메뉴+오늘날짜.xlsx 로 셋팅
//실제로 workbook을 만들고 파일로 다운로드 할수있게 만들어주는함수
workbook.xlsx.write(res)
.then(function (data) {
res.end();
console.log('File write done........');
});
}
}
module.exports = ExcelUtil;
밑에는 사용법.
excelUtil.excelDownload(
'TEST LIST',
response.data,
헤더리스트를 스트링으로 작성 (예시) "No,이름,주소,번호",
키리스트를 스트링으로 작성 (예시) "no,name,address,ph",
res
);
//res를 넘기는 이유는 모듈에서 바로 다운로드 되게끔 하기 위해서.
Js에서는 데이터테이블이 있기때문에 excel 다운로드가 기본 제공되어있지만,
업체에서 이런식으로 필요한 데이터만 잡아서 요청하게끔 개발 문의가 들어와서 커스터마이징 할수있도록 Util을 만들었다.
백단까지 가지 않아도 되는 부분이라 client쪽에서 처리하는 코드로 만들었다.
728x90
'프로그래밍 공부 > Node.js' 카테고리의 다른 글
[Redis] Node.js에서 Active-Active 일때 세션공유 (0) | 2021.03.26 |
---|---|
[Node.js/Okta] Node.js를 이용한 Okta SSO 로그인 (0) | 2021.02.23 |