1
2

More than 3 years have passed since last update.

【Node Express】DBのデータをExcellで出力。

Last updated at Posted at 2020-05-08

使うもの

1)sheet.js
エクセルファイルの書き換え等ができる。
今回はオブジェクトをエクセルファイルに変換するのに使用した。
https://www.npmjs.com/package/xlsx

インストール:
npm install --save xlsx

2)moment.js
時間を扱うのに便利そうだったため。
https://www.npmjs.com/package/moment

インストール:
npm install --save moment

実装

main.js
const express = require('express')
const app = express()
const model = require('モデルのパス')
const PREFS = require('定数ファイル').PREFS
const xlsx = require('xlsx')
const moment = require('moment')

app.get('/get_excel', async(req, res) => {
  try {
     const selectData = ['user_id', 'user_name', 'user_pref']
     const userSearch = await user.getUsers(selectData)
     if (userSearch) {
       var newData = userSearch.map(function(record) {
         record.ID = record.user_id
         record.ユーザー名 = record.user_name

         //都道府県をINTで管理していると仮定して。
         record.都道府県 = PREFS[record.user_pref]
         //数字は返しても仕方ないので消す。
         delete record.user_pref
          return record
      })

      //エクセルファイルを作成
      var newWB = xlsx.utils.book_new()
      //エクセルシートを作成
      var newWS = xlsx.utils.json_to_sheet(newData)
      //日付をつけた方が資料の管理がしやすそうなので、不要であればいらないです。
      const createTime = moment(Date.now()).format('YYYYMMDD')
      //ファイル名もといパスを指定
      const fileName = 'エクセルファイルの保存先のパス' + createTime + '_ユーザー情報.xlsx'
      //エクセルファイルにする
      xlsx.utils.book_append_sheet(newWB, newWS, 'ユーザー情報')
      xlsx.writeFile(newWB, fileName)
      //エクセルのパスを返す
      return res.status(200).download(fileName)
    } else {
      return res.status(500).json({ message: 'エラー発生!' })
    }
   } catch (err) {
      return res.status(500).json({ message: 'エラー発生!' })
   }
})

モデル

model.js
const mysql = require('mysql2')
const models = {}

//データベースの設定
const connection = mysql.createConnection({
  host: ホスト,
  user: ユーザー,
  password: パスワード,
  database: データベース名,
  port: ポート番号,
  multipleStatements: true //複数のコールを有効化
})

//モデル
model.getUsers = (selectData) => {
  return new Promise((resolve, reject) => {
    connection.query('SELECT ?? FROM user', [selectData], (err, results) => {
      if (err) return reject(err)
      else return resolve(results)
    })
  })
}

module.exports.model = model

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2