Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9027

EXCELファイルをバックアップし、DBに格納【Node.js Express】

$
0
0

エクセルファイルをアップロードしたら、バックアップを作成し、中身のデータをデータベースに登録するAPIを作りました。また似たような作業することになりそうなので、メモ。
Node.jsとExpress、データベースはMysqlを使用

使うもの

1)multer
アップロードされたエクセルファイルを特定のファイルにコピーする。
※ただし、multipart/form-dataのみ
https://www.npmjs.com/package/multer

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

2)sheetjs
エクセルファイルの書き換え等ができる。
今回はエクセルファイルをJSONに変換するのに使用した。
https://www.npmjs.com/package/xlsx

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

実装

constexpress=require('express')constapp=express()constmodels=require('../model/models')constxlsx=require('xlsx')constmulter=require('multer')conststorage=multer.diskStorage({//保存先を指定destination:function(req,file,cb){cb(null,'./uploads/excels')},//ファイル名の先端に日付をつけて保存filename:function(req,file,cb){cb(null,newDate().toISOString()+file.originalname)}})constfileFilter=(req,file,cb)=>{//ファイルの拡張子を確認 とりあえず、excelとspredsheetを。if(file.mimetype==='application/vnd.ms-excel'||file.minetype==='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'){cb(null,true)}else{cb(null,false)}}constupload=multer({storage:storage,limits:{//アップロードできるファイル数files:1,//ファイルサイズ(2MB@)fieldSize:2*1024*1024},fileFilter:fileFilter})app.post('/upload',upload.single('ファイル名'),async(req,res)=>{try{constsheet=xlsx.readFile('./uploads/excels/'+req.file.filename,{cellDates:true})constworkingSheet=sheet.Sheets['シート名']constdata=xlsx.utils.sheet_to_json(workingSheet)vardataArray=[]//カラム名varfieldNames=['date','name','tel']for(variindata){//String型を明記しないとエラーになったので。 //エクセルのカラム名?(カラム最上セルのテキスト)日本語なのがアレなので良い方法あれば教えて欲しいです。//電話番号は -(ハイフン) を抜き取る。varinsertData=`(${JSON.stringify(data[i].日付)}, ${JSON.stringify(data[i].名前)}, , ${data[i].電話番号.replace(/-/g,'')})`dataArray.push(insertData)}consttableName='テーブル名'//毎回データを総入れ替えする仕様のため、全データ消すconstareDeleted=awaitmodels.deleteAll(tableName)if(!areDeleted)returnres.status(500).json({message:'エラーが発生!'})//データを挿入constareInserted=awaitmodels.insertData(tableName,fieldNames,dataArray)if(!areInserted)returnres.status(500).json({message:'エラー発生!'})returnres.status(200).json({message:'成功!'})}catch(err){console.log(err)returnres.status(500).json({message:'エラーが発生!'})}})

モデル抜粋

model.js
constmysql=require('mysql2')constmodels={}// Setup databaseconstconnection=mysql.createConnection({host:ホスト,user:ユーザー,password:パスワード,database:データベース名,port:ポート番号,multipleStatements:true//複数のコールを有効化})connection.connect((err)=>{if(!err)console.log('接続成功')elseconsole.log('接続失敗 : '+JSON.stringify(err,undefined,2))})models.deleteAll=(tableName)=>{returnnewPromise((resolve,reject)=>{connection.query(`DELETE FROM ${tableName}`,(err,results)=>{console.log(results)if(err)returnreject(err)elsereturnresolve(results)})})}models.insertData=(tableName,fieldName,insertData)=>{returnnewPromise((resolve,reject)=>{connection.query(`INSERT INTO ${tableName} (${fieldName}) VALUES ${insertData}`,(err,results)=>{console.log(results)if(err)returnreject(err)elsereturnresolve(results)})})}module.exports.models=models

Viewing all articles
Browse latest Browse all 9027

Trending Articles