개요
최근에 NodeJS를 통해 엑셀파일을 불러와 새로운 엑셀로 생성하려고 하다 문제가 생겼다.
엑셀을 출력할 때 스타일, 차트, 함수 등이 전부 깨지는 현상이 발생한 것이다.
확인을 해보니 내가 사용하던 xlsx 라이브러리는 엑셀 저장을 할 때 기존에 불러온 엑셀을 그대로 저장하는 게 아닌 새로운 엑셀파일로 저장하는 것이 문제였다.
아무리 찾아봐도 차트를 유지해 주는 기능을 찾지 못했다.
그렇게 삽질을 이어가던 중 xlsx-populate라는 라이브러리를 발견했다.
https://www.npmjs.com/package/xlsx-populate
해당 라이브러리는 엑셀의 기존 스타일, 암호화, 통합문서들의 기능들을 유지하는데 중점을 두고 만들었다고 한다.
꽤 괜찮은 느낌이라 테스트용으로 작성을 해봤다.
구성
- VSCode
- node.js
- xlsx-populate
진행
우선 아래의 명령어로 xlsx-populate 패키지를 설치하자.
npm i xlsx-populate
그다음은 샘플용 엑셀파일을 준비할 것이다.
<foods.xlsx>
함수, 차트가 들어가 있는 간단한 엑셀파일이다.
테스트를 위해 이걸 이제 nodejs 프로젝트 폴더에 넣어두자.
이제 코드를 작성해 보도록 하자.
<index.js>
const XlsxPopulate = require('xlsx-populate');
async function main(){
const workbook = await XlsxPopulate.fromFileAsync("./foods.xlsx"); //엑셀 로드
const sheet = workbook.sheet(0); //가장 첫 번째 시트를 가져온다.
sheet.column(2).cell(2).value(100); //2열 2행 (B2) 의 값을 100으로 변경한다.
await workbook.toFileAsync("./foods_updated.xlsx"); //변경된 워크북을 저장한다.
}
main();
간단한 예시인데 주석에 나온 내용처럼 B2 셀의 데이터를 100으로 바꿔서 `foods_update.xlsx`라는 새로운 엑셀파일로 저장하려 한다.
실행을 하고 엑셀 파일을 열어보자.
<foods_updated.xlsx>
기존의 사과의 카운트가 5에서 100으로 바뀐 것을 확인했고,
Total 카운트를 구하는 함수의 값도 유지되며 차트도 반영이 된 상태로 저장이 되어있다.
이번에는 xlsx-populate를 조금 더 알아볼 겸 표가 있는 셀 부분에 스타일을 적용해 보도록 하자.
<index.js>
const XlsxPopulate = require('xlsx-populate');
async function main(){
const workbook = await XlsxPopulate.fromFileAsync("./foods.xlsx"); //엑셀 로드
const sheet = workbook.sheet(0); //가장 첫 번째 시트를 가져온다.
const range = sheet.range("A1:B6"); //해당 시트에서 A1부터 B6의 영역을 가져온다.
range.style({
fontSize: 12, //글자 크기
fill: "DDDDDD", //채우기 색
fontColor: "000000", //글자색
bold: true, //볼드체 여부
horizontalAlignment: "center", // 텍스트 좌우 중앙 정렬
verticalAlignment: "center", // 텍스트 수직 중앙 정렬
border: { //각 셀의 테두리 옵션
top: {
style: "thin",
color: "000000"
},
left: {
style: "thin",
color: "000000"
},
right: {
style: "thin",
color: "000000"
},
bottom: {
style: "thin",
color: "000000"
},
}
})
await workbook.toFileAsync("./foods_updated.xlsx"); //변경된 워크북을 저장한다.
}
main();
<foods_updated.xlsx>
각 셀의 스타일이 잘 적용되었다.
결론
단점은 패키지의 마지막 업데이트가 5년 전이라 typescript도 적용이 되어있지 않아 일일이 문서를 찾아보며 기능들을 확인할 수밖에 없다. 그럼에도 엑셀의 원형을 유지한다는 장점이 최고라 npm에서 인기가 꽤 높은 편인 것 같다.
그 밖에도 다양한 기능을 가지고 있어, 직접 문서를 확인하며 활용을 해보는 것을 추천한다.
https://www.npmjs.com/package/xlsx-populate
'⚙️ Node.js' 카테고리의 다른 글
[NodeJS] 아주 쉽게 타입스크립트 적용하기 (1) | 2024.09.05 |
---|---|
[DiscordJS] 10분만에 디스코드 봇 제작하기 (4) | 2024.09.05 |
[NestJS] Async, 비동기로 인한 프로세스 중단 방지 (0) | 2024.08.21 |
[Javascript 심화] 함수 1 (0) | 2024.01.28 |
[Javascript 심화] 배열 (0) | 2024.01.28 |