개발 창고/NodeJS

[ExcelJS] 내용 덮어 씌우기

로이제로 2023. 1. 16. 22:00
반응형
const path      = require("path");      // 디렉토리 경로
const exceljs   = require("exceljs");   // 엑셀 관련 API

(async() => {
    try{
        const filename  = "excelappend.xlsx";               // 파일명
        const template  = path.join(__dirname, filename);   // 템플릿 파일 위치
        const workbook  = new exceljs.Workbook();
        
        // Step. Excel Template 파일 Read
        workbook.xlsx.readFile(template)
        .then(() => {
            // Step. 해당 템플릿 엑셀에서 Sheet1번 Sheet를 불러옴
            const sheet = workbook.getWorksheet("Sheet1");

            const stRow = 2;    // 시작 Row번호
            const edRow = 16;   // 종료 Row번호

            // Step. Sheet1의 각 Row에 데이터 추가
            for(let nRow = stRow; nRow <= edRow; nRow++){
                const curRow    = sheet.getRow(nRow);   // 현재 Row
                const seq       = (nRow - stRow) + 1;   // 순번

                // Step. 해당 Row의 각 Cell에 값 설정
                curRow.getCell("A").value = seq;
                curRow.getCell("B").value = "홍길동";
                curRow.getCell("C").value = "안녕하세요 반가워요 #" + seq;

                // Step. 해당 Row의 변경 값 Apply
                curRow.commit();
            }

            // Step. 수정된 Workbook을 template로 덮어씌움
            workbook.xlsx.writeFile(template);
        })
    }catch(err){
        console.log(err.message);
    }
})();

 

 업무를 하다 보면 기존 엑셀에 덮어씌워야 하는 경우가 발생하곤 합니다. 이 경우 exceljs를 적절히 잘 활용하면 아래와 같은 결과물을 받아볼 수 있습니다.

[변경 전] excelappend.xlsx
[변경 후] excelappend.xlsx

 헤더와 기존 엑셀에 적용한 스타일들은 그대로 두고 공란만 채워 넣은 상태입니다.

 


  api 설치

$> npm i exceljs --save


우선 아래와 같이 사용할 API를 선언해줍니다.

path는 Template파일을 불러오기 위해 사용된 API이고

exceljs는 엑셀의 값을 채워주고 덮어씌워주기 위해 사용된 API입니다.

const path      = require("path");      // 디렉토리 경로
const exceljs   = require("exceljs");   // 엑셀 관련 API

 그다음 변경할 대상 템플릿 엑셀파일을 filename으로 지정해 주고, 해당 파일을 현재 source파일과 동일한 위치에 배치합니다.

node파일인 excelappend.js와 템플릿파일인 excelappend.xlsx가 동일한 위치에 배치 됨

 __dirname은 현재 js파일의 위치이고, path.join을 하게 되면 해당 위치 기준으로 filename의 파일을 찾게 됩니다. 이후 생성된 workbook 변수에 template 파일을 읽어 들입니다.

const filename  = "excelappend.xlsx";               // 파일명
const template  = path.join(__dirname, filename);   // 템플릿 파일 위치
const workbook  = new exceljs.Workbook();

// Step. Excel Template 파일 Read
workbook.xlsx.readFile(template)

 읽어 들인 템플릿이 정상적인 경우, 해당 workbook에서 변경하려는 Sheet를 불러옵니다. Sheet명의 기준은 엑셀의 하단에 Sheet명으로 지정해 줍니다.

excelappend.xlsx의 Sheet명 Sheet1

 그다음 각 Sheet의 Row를 For Loop를 수행하며, 한 줄씩 데이터를 입력해 줍니다.

// Step. 해당 템플릿 엑셀에서 Sheet1번 Sheet를 불러옴
const sheet = workbook.getWorksheet("Sheet1");

const stRow = 2;    // 시작 Row번호
const edRow = 16;   // 종료 Row번호

// Step. Sheet1의 각 Row에 데이터 추가
for(let nRow = stRow; nRow <= edRow; nRow++){
    const curRow    = sheet.getRow(nRow);   // 현재 Row
    const seq       = (nRow - stRow) + 1;   // 순번

    // Step. 해당 Row의 각 Cell에 값 설정
    curRow.getCell("A").value = seq;
    curRow.getCell("B").value = "홍길동";
    curRow.getCell("C").value = "안녕하세요 반가워요 #" + seq;

    // Step. 해당 Row의 변경 값 Apply
    curRow.commit();
}

 마지막으로 수정된 workbook 내용을 Template에 입력해 줍니다. (※ 만약 여기서 Template를 덮어씌우는 게 아닌 새로운 파일로 지정하고 싶다면 해당 파일을 Template파일을 path에서 join 했듯이 선언하여 주면 됩니다.)

// Step. 수정된 Workbook을 template로 덮어씌움
workbook.xlsx.writeFile(template);

 


  실행

$> node excelappend.js


  오류

만약 실행을 했는데 아래와 같은 오류가 발생한 경우

 이는 현재 사용하려는 엑셀 파일인 excelappend.xlsx가 열려있기 때문에 덮어씌우기가 안 되는 상태이므로 해당 엑셀 파일을 닫아주면 됩니다.

반응형