꾸준히 공부하는 개발자

[Node.js] xlsx를 이용하여 excel 다운로드 본문

Node.js

[Node.js] xlsx를 이용하여 excel 다운로드

kauboy 2019. 11. 9. 15:06

프론트에서 데이터를 받아와 버튼을 누르면 직접 엑셀을 만들어 엑셀을 다운로드 받아야 할 일이 생겼다.
구글링을 하던 도중 좋은 오픈소스를 발견하여 해결하였다.

const data = [[],[],[]] <- excel에 넣고싶은 데이터
function datenum(v, date1904) {
          if (date1904) v += 1462;
          const epoch = Date.parse(v);
          return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
        }

        function sheet_from_array_of_arrays(data, opts) {
          const ws = {};
          const range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
          for (let R = 0; R != data.length; ++R) {
            for (let C = 0; C != data[R].length; ++C) {
              if (range.s.r > R) range.s.r = R;
              if (range.s.c > C) range.s.c = C;
              if (range.e.r < R) range.e.r = R;
              if (range.e.c < C) range.e.c = C;
              const cell = {v: data[R][C]};
              if (cell.v == null) continue;
              const cell_ref = XLSX.utils.encode_cell({c: C, r: R});

              if (typeof cell.v === 'number') cell.t = 'n';
              else if (typeof cell.v === 'boolean') cell.t = 'b';
              else if (cell.v instanceof Date) {
                cell.t = 'n';
                cell.z = XLSX.SSF._table[14];
                cell.v = datenum(cell.v);
              } else cell.t = 's';

              ws[cell_ref] = cell;
            }
          }
          if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
          return ws;
        }

        const ws_name = "SheetJS";

        function Workbook() {
          if (!(this instanceof Workbook)) return new Workbook();
          this.SheetNames = [];
          this.Sheets = {};
        }

        let wb = new Workbook(), ws = sheet_from_array_of_arrays(data);

        /* add worksheet to workbook */
        wb.SheetNames.push(ws_name);
        wb.Sheets[ws_name] = ws;

        /* write file */
        XLSX.writeFile(wb, 'test.xlsx');

출처: https://gist.github.com/SheetJSDev/88a3ca3533adf389d13c

 

write.js

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

XLS와 XLSX 의 차이

엑셀에서 2003년 전에 저장한 버젼이 xls

엑셀에서 2007년 후에 저장한 버전이 xlsx 라고 한다.

 

writefile 할 때 xls 로 했더니 string maxLength가 255가 되어 저장이 되는걸 발견하였다.

해결방법: xls -> xlsx로 하는 수 밖에 없다.

 

sheetjs 이슈를 뒤져보다가 알게되었다.

https://github.com/SheetJS/sheetjs/issues/1517

Comments