Nodejs로 Excel 파일을 만드는 방법은 무엇입니까?


86

저는 nodejs 프로그래머입니다. 이제 Excel 파일 형식으로 저장하려는 데이터 테이블이 있습니다. 어떻게해야합니까?

몇 가지 Node 라이브러리를 찾았습니다. 하지만 대부분은 Excel Writer가 아닌 Excel Parser입니다. 저는 Linux Server를 사용하고 있습니다. 따라서 Linux에서 실행할 수있는 무언가가 필요합니다. 알고있는 유용한 라이브러리가 있으면 알려주세요.

아니면 CSV 파일을 xls 파일 (프로그래밍 방식)로 변환 할 수있는 방법이 있습니까?

답변:


101

excel4node공식 사양에서 빌드 된 유지 관리되는 기본 Excel 파일 생성기 입니다. 유사하지만 다른 답변에서 언급 한 mxexcel-builder 보다 더 유지 됩니다.

// Require library
var excel = require('excel4node');

// Create a new instance of a Workbook class
var workbook = new excel.Workbook();

// Add Worksheets to the workbook
var worksheet = workbook.addWorksheet('Sheet 1');
var worksheet2 = workbook.addWorksheet('Sheet 2');

// Create a reusable style
var style = workbook.createStyle({
  font: {
    color: '#FF0800',
    size: 12
  },
  numberFormat: '$#,##0.00; ($#,##0.00); -'
});

// Set value of cell A1 to 100 as a number type styled with paramaters of style
worksheet.cell(1,1).number(100).style(style);

// Set value of cell B1 to 300 as a number type styled with paramaters of style
worksheet.cell(1,2).number(200).style(style);

// Set value of cell C1 to a formula styled with paramaters of style
worksheet.cell(1,3).formula('A1 + B1').style(style);

// Set value of cell A2 to 'string' styled with paramaters of style
worksheet.cell(2,1).string('string').style(style);

// Set value of cell A3 to true as a boolean type styled with paramaters of style but with an adjustment to the font size.
worksheet.cell(3,1).bool(true).style(style).style({font: {size: 14}});

workbook.write('Excel.xlsx');

아직 시도하지 않았지만 유망 해 보입니다! 감사합니다
난폭자 응우 엔

안녕하세요 mikemaccana, 어디에서이 코드를 사용해야합니까? 이 코드를 컨트롤러 또는 스키마 코드에서 사용해야합니까? 당신은이 질문에 대답 할 수 stackoverflow.com/questions/44369082/...
Vinoth

오류가 발생합니다. 'excel4node'모듈을 찾을 수 없으며 사용하기 전에 npm 설치로 설치했습니다
Raz

1
@raz 질문으로해야합니다.
mikemaccana

@mikemaccana는 배열 목록을 내보낼 수있는 방법이 있습니다.
Vinoth

51

난 그냥 간단한 방법을 찾았어요. 이것은 작동합니다-

구분 기호로 탭을 사용하여 파일을 만듭니다 (CSV와 유사하지만 쉼표를 Tab으로 대체). 확장자 .XLS로 저장하십시오. 파일은 Excel에서 열 수 있습니다.

도움이되는 코드-

var fs = require('fs');
var writeStream = fs.createWriteStream("file.xls");

var header="Sl No"+"\t"+" Age"+"\t"+"Name"+"\n";
var row1 = "0"+"\t"+" 21"+"\t"+"Rob"+"\n";
var row2 = "1"+"\t"+" 22"+"\t"+"bob"+"\n";

writeStream.write(header);
writeStream.write(row1);
writeStream.write(row2);

writeStream.close();

이렇게하면 XLS 파일 형식으로 파일이 생성됩니다. XLS 대신 XLSX를 시도하면 작동하지 않습니다.


4
쉼표를 사용하고 노드가있는 CSV 파일을 만든 다음 Excel로 가져 오지 않는 이유는 무엇입니까? 이런 식으로 Excel은 작업을 수행하고 xls / xlsx 파일을 올바르게 만들 수 있습니다.
BrandonKowalski

1
아 잡았다. 그러나 당신이 찾은 깔끔한 수정.
BrandonKowalski

1
또한 특수 문자를 지원하기 위해, 나는 오 - CSV와 간단한 래퍼를 만들어 github.com/SimpliField/oh-csv#excel-compatible-csv가stackoverflow.com/questions/6588068/...
nfroidure

7
"이렇게하면 XLS 파일 형식으로 파일이 생성됩니다." 아니에요. 여전히 CSV 파일이며 여러 워크 시트와 같은 뛰어난 작업을 수행 할 수 없습니다.
mikemaccana

5
이것은 엑셀 파일이 아니기 때문에 질문에 전혀 대답하지 않습니다.
Darryn Hosking

23

msexcel-builder를 사용하십시오 . 다음과 함께 설치하십시오.

npm install msexcel-builder

그때:

// Create a new workbook file in current working-path 
var workbook = excelbuilder.createWorkbook('./', 'sample.xlsx')

// Create a new worksheet with 10 columns and 12 rows 
var sheet1 = workbook.createSheet('sheet1', 10, 12);

// Fill some data 
sheet1.set(1, 1, 'I am title');
for (var i = 2; i < 5; i++)
  sheet1.set(i, 1, 'test'+i);

// Save it 
workbook.save(function(ok){
  if (!ok) 
    workbook.cancel();
  else
    console.log('congratulations, your workbook created');
});

3
결과 파일을 디스크에 저장하는 대신 응답 개체로 파이프 할 수 있습니까?
lvarayut

물론 npm 요청을 시도하십시오.
헤샴 야신

3
이것은 훌륭한 답변이지만 (현재 표시된 답변, Excel 파일을 전혀 생성하지 않음) mxexcel-builder4 년 동안 업데이트가 없습니다. excel4node아래를 사용하여 답변을 추가했습니다 .
mikemaccana

안녕하세요 Hesham Yassin,이 질문에 답해 주
시겠습니까?

npm에서 샘플 코드를 실행할 때 콘솔에이 경고가 표시됩니다.(node:11702) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
Mathew John

12

ExcelJS 를 확인해야합니다.

CSV 및 XLSX 형식으로 작동합니다.

XLSX 스트림 읽기 / 쓰기에 적합합니다. XLSX 다운로드를 Express 응답 개체로 스트리밍하는 데 사용했습니다. 기본적으로 다음과 같습니다.

app.get('/some/route', function(req, res) {
  res.writeHead(200, {
    'Content-Disposition': 'attachment; filename="file.xlsx"',
    'Transfer-Encoding': 'chunked',
    'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  })
  var workbook = new Excel.stream.xlsx.WorkbookWriter({ stream: res })
  var worksheet = workbook.addWorksheet('some-worksheet')
  worksheet.addRow(['foo', 'bar']).commit()
  worksheet.commit()
  workbook.commit()
}

대용량 파일에 적합하며 excel4node 보다 훨씬 더 나은 성능을 발휘합니다.스트리밍 기능이 훨씬 제한적이기 때문에 합니다. 데이터가 생성 될 수있는 즉시 청크를 검색하기 위해 "commit ()"데이터를 허용하지 않습니다.)

this SO answer 도 참조하십시오 .


8

새 Office의 XLSx는 XML 및 기타 파일의 압축 모음 일뿐입니다. 그래서 당신은 그것을 생성하고 그에 따라 압축 할 수 있습니다.

보너스 : 스타일 등으로 매우 멋진 템플릿을 만들 수 있습니다.

  1. '좋아하는 스프레드 시트 프로그램'에서 템플릿 만들기
  2. ODS 또는 XLSx로 저장
  3. 콘텐츠 압축 해제
  4. 그것을 기반으로 사용하고 데이터로 채우십시오 content.xml(또는 xl/worksheets/sheet1.xml)
  5. 서빙하기 전에 모두 압축하십시오

그러나 나는 ODS (openoffice)가 훨씬 더 접근하기 쉽다는 것을 알았습니다 (엑셀은 여전히 ​​그것을 열 수 있습니다), 여기에서 찾은 것입니다. content.xml

<table:table-row table:style-name="ro1">
    <table:table-cell office:value-type="string" table:style-name="ce1">
        <text:p>here be a1</text:p>
    </table:table-cell>
    <table:table-cell office:value-type="string" table:style-name="ce1">
        <text:p>here is b1</text:p>
    </table:table-cell>
    <table:table-cell table:number-columns-repeated="16382"/>
</table:table-row>

1
OOXML을 배우는 것은 쉬운 일이 아닙니다. 또한 다른 파일 형식을 사용하는 것은 질문에 대한 답이 아닙니다. 이것은 주석으로 더 좋을 것입니다.
mikemaccana

7

이 질문에는 여러 가지 답변이 있지만 이제는 약간 날짜가있을 수 있습니다.

새로운 독자는 xlsx 또는 "sheetsJS"를 선호 할 수 있습니다. 패키지를 사용 사례에서 가장 인기있는 노드 패키지 인 것으로 보입니다.

현재 최고 답변은 excel4node를 권장하는데, 이는 꽤 좋아 보이지만 후자의 패키지는 전자보다 유지 관리가 덜하고 인기가 떨어집니다.

xlsx를 사용하여 질문에 직접 답변 :

const XLSX = require('xlsx');

/* create a new blank workbook */
const wb = XLSX.utils.book_new();

// Do stuff, write data
//
//

// write the workbook object to a file
XLSX.writeFile(workbook, 'out.xlsx');

6

fs 사용 패키지를 JSON 데이터에서 Excel / CSV 파일을 만들 수 있습니다.

1 단계 : JSON 데이터를 변수에 저장 (여기서는 jsn있음) 변수에 있음).

2 단계 : 빈 문자열 변수 생성 (여기 데이터 ).

3 단계 : jsn의 모든 속성 을 문자열 변수 데이터에 추가하고 put을 추가합니다.'\t' 하고 행을 완료 한 후 2 개 셀 사이에 '\ n'을 추가합니다.

코드 :

var fs = require('fs');

var jsn = [{
    "name": "Nilesh",
    "school": "RDTC",
    "marks": "77"
   },{
    "name": "Sagar",
    "school": "RC",
    "marks": "99.99"
   },{
    "name": "Prashant",
    "school": "Solapur",
    "marks": "100"
 }];

var data='';
for (var i = 0; i < jsn.length; i++) {
    data=data+jsn[i].name+'\t'+jsn[i].school+'\t'+jsn[i].marks+'\n';
 }
fs.appendFile('Filename.xls', data, (err) => {
    if (err) throw err;
    console.log('File created');
 });

산출


1
이것은 답변 중 하나의 사본이 아닙니까?
geeky_monster 2011

아마도 이전 답변을 연장했을 것입니다.
Nilesh Pawar

4

또는-Express를 사용하여 @Jamaica Geek의 답변을 기반으로 파일을 저장하고 읽는 것을 방지합니다.

  res.attachment('file.xls');

  var header="Sl No"+"\t"+" Age"+"\t"+"Name"+"\n";
  var row1 = [0,21,'BOB'].join('\t')
  var row2 = [0,22,'bob'].join('\t');

  var c = header + row1 + row2;
  return res.send(c);

4
불행히도 이것은 좋은 생각이 아닙니다. 데이터가 이러한 순진한 코드를 깨뜨릴 수 있습니다. 위의 방법을 사용할 때 발생하는 문제 : 1. 셀에 따옴표 또는 새 줄이 포함 된 경우 열이 끊어집니다. 2. Mac에서 Excel로 가져올 때 인코딩 문제 (올바른 BOM decodeURIComponent ( "% EF % BB % BF")를 포함하고 UTF16LE을 사용하여 인코딩해야합니다. 대신 적절한 라이브러리를 사용하는 것이 좋습니다
Maciej Jankowski

3

exceljs 설치

npm i exceljs --save

exceljs 가져 오기

var Excel = require('exceljs');
var workbook = new Excel.Workbook();

통합 문서 만들기

var options = {
                filename: __dirname+'/Reports/'+reportName,
                useStyles: true,
                useSharedStrings: true
            };

            var workbook = new Excel.stream.xlsx.WorkbookWriter(options);

워크 시트 생성 후

var worksheet = workbook.addWorksheet('Rate Sheet',{properties:{tabColor:{argb:'FFC0000'}}});

workstation.column 배열에서 헤더에 열 이름을 전달하고 키에 배열 키를 전달합니다.

worksheet.columns = [
            { header: 'column name', key: 'array key', width: 35},
            { header: 'column name', key: 'array key', width: 35},
            { header: 'column name', key: 'array key', width: 20},

            ];

forEach 루프를 사용한 후 엑셀 파일에 하나씩 행 추가

array.forEach(function(row){ worksheet.addRow(row); })

각 엑셀 행과 셀에 루프를 수행 할 수도 있습니다.

worksheet.eachRow(function(row, rowNumber) {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
});
row.eachCell(function(cell, colNumber) {
    console.log('Cell ' + colNumber + ' = ' + cell.value);
});

1

기존 Excel 시트를 만들고 작성하려면 exceljs 라이브러리를 사용하십시오.

자세한 설명은이 튜토리얼을 확인할 수 있습니다.

링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.