Node.jsでExcel⇒JSON、JSON⇒Excel変換するサンプル

# やること
1．ExcelファイルをJSONで取得。
2．JSONの編集後、新しいExcelファイルに出力する。

# 環境
## Node.js
・インストール
　<a href="https://nodejs.org/ja/" rel="noopener noreferrer" target="_blank">https://nodejs.org/ja/</a> 
　推奨版(執筆時点：12.18.4)

・package.jsonの作成
　作業用ディレクトリで以下を実行する。
　<code>npm init -y</code>（-y：全てYesでデフォルト設定）

## xlsx(npm package)
・インストール
　<code>npm install xlsx</code>

・公式
　<a href="https://www.npmjs.com/package/xlsx" rel="noopener noreferrer" target="_blank">https://www.npmjs.com/package/xlsx</a>

# 実装
## 前提
・本の貸出履歴から、各ユーザの<font color="red">未返却履歴のみを抽出する</font>状況を想定。
・履歴データはユーザIDと書籍コードで管理されているため、抽出データは氏名と書籍名を追加する。
・データは以下とする。（BookLendingHistory.xlsx）

＜貸出履歴＞
<img src="https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ef571c1461.png" alt="" width="449" height="227" class="alignnone size-full wp-image-2318" />

＜ユーザマスタ＞
<img alt='' class='alignnone size-full wp-image-2301 ' src='https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ee0bf05e04.png' />

＜書籍マスタ＞
<img alt='' class='alignnone size-full wp-image-2302 ' src='https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ee0d1f0253.png' />

## Excelファイルの読込
``` index.js
let XLSX = require('xlsx')
let workbook = XLSX.readFile('BookLendingHistory.xlsx', {cellDates:true})
// cellDates（日付セルの保持形式を指定）
// false：数値（シリアル値）[default]
// true ：日付フォーマット
```

## データ取得(JSON)
シート毎にJSONで取得します。

``` index.js
let history, users, books
workbook.SheetNames.forEach(sheet =&gt; {
    if("history" == sheet) history = XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
    if("users" == sheet) users = XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
    if("books" == sheet) books = XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
})
```

history（貸出履歴）
※データが無いセルのJSONプロパティは取得されません。（返却日時）
<img src="https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ef5c3d1b7a.png" alt="" width="306" height="624" class="alignnone size-full wp-image-2319" />

users（ユーザマスタ）
<img alt='' class='alignnone size-full wp-image-2306 ' src='https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ee642031e2.png' />

books（書籍マスタ）
<img alt='' class='alignnone size-full wp-image-2308 ' src='https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ee686e168c.png' />

## 抽出
返却日時が無い履歴を抽出します。

``` index.js
let notReturned = history.filter(function(item) {
    return !("返却日時" in item) 
})
```

抽出結果
<img src="https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ef5f286aef.png" alt="" width="293" height="427" class="alignnone size-full wp-image-2320" />

## 加工
 ユーザ名と書籍名を加えたJSONを作成します。

``` index.js
let notReturnedReport = []
notReturned.forEach(item =&gt; {
    item.ユーザ名 = getUserName(item)
    item.書籍名 = getBookName(item)
    notReturnedReport.push(item)
})

/**
 * JSON内のユーザIDに一致するユーザ名を返す
 * @param {*} item 
 */
function getUserName(item){
    let userName = ""
    users.some(function(user) {
        if(user.ユーザID == item.ユーザID) userName = user.ユーザ名
    })
    return userName
}

/**
 * JSON内の貸出書籍コードに一致する書籍名を返す
 * @param {*} item 
 */
function getBookName(item){
    let bookName = ""
    books.some(function(book) {
        if(book.書籍コード == item.貸出書籍コード) bookName = book.書籍名
    })
    return bookName
}
```

加工結果
<img src="https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ef64e1ef60.png" alt="" width="298" height="571" class="alignnone size-full wp-image-2321" />

## 出力(Excel)
新しいExcelファイルに書き出します。
 
``` index.js
let exportBook = XLSX.utils.book_new()
let sexportSheet = XLSX.utils.json_to_sheet(notReturnedReport)
XLSX.utils.book_append_sheet(exportBook, sexportSheet, "sheetName")
XLSX.writeFile(exportBook, "NotReturnedReport.xlsx")
```

出力されたExcelファイル
<img alt='' class='alignnone size-full wp-image-2323 ' src='https://loglog.xyz/wp-content/uploads/2020/09/img_5f6ef6cc0b5ad.png' />

# Github
<a href="https://github.com/TakumiKondo/excel_json/blob/master/README.md" title="https://github.com/TakumiKondo/excel_json" rel="noopener noreferrer" target="_blank">Sample of Excel to JSON or JSON to Excel</a>