Node.js(Express)でcsvを生成してダウンロード

json2csvのインストール

json2csvというパッケージを使用します。

$ npm i json2csv
$ npm i --save-dev @types/json2csv // typescriptの場合

オブジェクトをCSVに変換

適当に実装します。

type Data = {
  id: number
  name: string
  price: number
  someSecret: string
  date: Date
}

const data: Data[] = [
  {
    id: 1,
    name: 'りんご',
    price: 200,
    someSecret: 'xxx',
    date: new Date('2021-05-01')
  },
  {
    id: 2,
    name: 'バナナ',
    price: 150,
    someSecret: 'xxx',
    date: new Date('2021-05-02')
  },
  {
    id: 3,
    name: 'もも',
    price: 300,
    someSecret: 'xxx',
    date: new Date('2021-05-03')
  },
]

const fields = ['id', 'name', 'price', 'date']

const output = parse(data, {
  fields,
  withBOM: true
})
console.log(output)

変換処理は、json2csvのparseが行います。 parseの第一引数には処理するオブジェクトを、第二引数にはオプションが渡せます。

今回渡しているオプションは以下のとおりです。

オプション 説明
fields CSVで出力するフィールドをオブジェクトのキーで指定できます。
withBOM trueを指定するとBOMヘッダを付与します。BOMヘッダを付与するとExcelで開く際にUTF-8が使われていることを認識させることができます。つまりは文字化け対策です。

他の使用可能なオプションは公式ドキュメントを参照してください。

ログを確認すると、期待どおりCSVで出力されています。

"id","name","price","date"
1,"りんご",200,"2021-05-01T00:00:00.000Z"
2,"バナナ",150,"2021-05-02T00:00:00.000Z"
3,"もも",300,"2021-05-03T00:00:00.000Z"

ExpressでCSVをダウンロード

CSVに変換したものをダウンロードさせるようにします。 そのためには、以下ヘッダーを設定する必要があります。

res.setHeader('Content-disposition', 'attachment; filename=data.csv');
res.setHeader('Content-Type', 'text/csv; charset=UTF-8');

以下が実装になります。

import express from 'express'
import { parse } from 'json2csv'

const app = express()

type Data = {
  id: number
  name: string
  price: number
  someSecret: string
  date: Date
}

const data: Data[] = [
  {
    id: 1,
    name: 'りんご',
    price: 200,
    someSecret: 'xxx',
    date: new Date('2021-05-01')
  },
  {
    id: 2,
    name: 'バナナ',
    price: 150,
    someSecret: 'xxx',
    date: new Date('2021-05-02')
  },
  {
    id: 3,
    name: 'もも',
    price: 300,
    someSecret: 'xxx',
    date: new Date('2021-05-03')
  },
]

const fields = ['id', 'name', 'price', 'date']

app.get('/csv', (_, res) => {
  res.setHeader('Content-disposition', 'attachment; filename=data.csv');
  res.setHeader('Content-Type', 'text/csv; charset=UTF-8');
  const output = parse(data, {
    fields
  })
  console.log(output)
  res.send(output)
})

app.listen(3000, () => {
  console.log('start server on port 3000')
})

http://localhost:3000/csv にアクセスすると、CSVファイルがダウンロードされます。

参考

expressでCSVファイルをダウンロードさせる 【Node.js】JSON文字列をCSVファイルとして吐き出す

この記事をシェアする
Twitterで共有
Hatena

関連記事