exceljs ヘッダーを除外するとかダブルクォートをつけるとか

2023/04/17に公開

とある案件でCSVを出力する際にexceljsを使うことになり、その際要件としてヘッダーを除外する必要がありました。

exceljsのversitonは4.3.0です。

ヘッダー除外

以下のように出力時のオプションでheaders=falseと指定すればヘッダーが消えると期待しましたがダメでした。

    const uint8Array = await workbook.csv.writeBuffer({
      formatterOptions: {
        headers: false, // ヘッダーが出力対象外となる訳ではない?
      }
    });

結局、次のようにspliceRowsで1行目を削除することで対応しました。

  worksheet.spliceRows(1, 1);

ただし、ヘッダー行を消した場合はデータが設定されてるところまでしか項目がCSVとして出力されないので注意してください。
例えば、「A,B,C,D」と4項目あるCSVで、Cまでしかデータが存在しない場合は「A,B,C」と出力されます。「A,B,C,」とはなりません。

データの欠落が問題になる場合は、最後の項目にNull値を与える+ダブルクォートを付与する必要があります。

    worksheet.columns = [
      { header: 'ID', key: 'id' },
      { header: '名前', key: 'name' },
      { header: '住所', key: 'address' },
      { header: '備考', key: 'remarks' },
    ];
    
    // remarksにNull値を与える
    worksheet.addRow({id: 1001, name: '名前A', address: '住所A', remarks: ''});
    worksheet.addRow({id: 1002, name: '名前B', address: '住所B', remarks: ''});
    worksheet.addRow({id: 1003, name: '名前C', address: '住所C', remarks: ''});
    worksheet.spliceRows(1, 1);

    const uint8Array = await workbook.csv.writeBuffer({
      formatterOptions: {
        headers: false,
	quoteColumns: [false,true,true,true], // remarksにもダブルクォートを付けるようにする
      }
    });

ちなみに、ダブルクォートはwriteBufferの出力時にquoteColumnsで指定しなければ付与されないことに注意です。
※データに改行やダブルクォートが存在する場合は自動で付与されます

Discussion