Excel ファイル (.xlsx)を自動的に出力して欲しいという要望があり、今までExcelVBAで作成していましたが、なんとか開発効率を上げられないかと考えている中で試行錯誤で使ってみましたので、紹介します。
※タイトルに TypeScript で、と書いてますが、あまりTypeScript的な要素は無いです。
1. Nodeモジュール
xlsx
というモジュールを使ってみました。インストールは以下のコマンドで行います。
npm i xlsx
2. 配列からワークシートを作成し、Excelファイルを出力する。
import * as xlsx from "xlsx"
const Workbook = xlsx.utils.book_new();
let wsData = [
["ヘッダ1", "ヘッダ2"],
["値1", "値2"]
]
let ws = xlsx.utils.aoa_to_sheet(wsData)
xlsx.utils.book_append_sheet(Workbook, ws, "AOASheet")
xlsx.writeFile(Workbook, "aoa.xlsx")
実行すると、aoa.xlsx
というファイルがカレントディレクトリに出力されます。
以下のようなExcelファイルが作成されるはずです。
xlsx.utils.book_new()
で、Excelブックを新規作成しています。xlsx.utils.aoa_to_sheet
で、配列データを受け取ってワークシートオブジェクトを生成します。その後、xlsx.utils.book_append_sheet
で、ワークシートをブックに追加します。このときのワークシート名はAOASheet
としています。xlsx.writeFile
でファイルに書きだしています。このときのファイル名はaoa.xlsx
としています。
3. JSON からワークシートを作成し、Excelファイルを出力する。
import * as xlsx from "xlsx"
const Workbook = xlsx.utils.book_new();
let wsData = [
{ "ヘッダ1":1, "ヘッダ2":2},
{ "ヘッダ1":"A", "ヘッダ2":"B"}
]
let option = {
header:["ヘッダ1","ヘッダ2"]
}
let ws = xlsx.utils.json_to_sheet(wsData, option)
xlsx.utils.book_append_sheet(Workbook, ws, "test1")
xlsx.writeFile(Workbook, "json.xlsx")
実行すると、json.xlsx
というファイルがカレントディレクトリに出力されます。
以下のようなExcelファイルが作成されるはずです。
変化点としては、ワークシートとヘッダを分けて定義しています。
wsData
オブジェクトでデータを定義しています。オブジェクトのメンバーは後述するoption
のヘッダ項目名と対応します。option
オブジェクトで、オプションを定義しています。この中のheader
配列でヘッダ名を定義しています。
4. 感想
- データベースからSQLで情報をとってきて、Excelに変換する処理だったら、VBAより効率よく実装できそう。
- 罫線とかグラフとかの作成方法は分からないので、今後調査する。
- このモジュールがMicrosoft製ではないので、出来ないことがあることを念頭に使用する。
- すべてを網羅しようと思うと、PowerShellとかC#とかVBAを使用するべき。
実践TypeScript【電子書籍】[ 吉井健文 ]
価格:3726円 (2019/7/23時点)
楽天で購入
](https://hb.afl.rakuten.co.jp/hgc/18648e8b.7d833591.18648e8c.ed1bab3c/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F5456816fd8833397a6aa8b80647873ad%2F%3Fscid%3Daf_pc_bbtn&m=http%3A%2F%2Fm.rakuten.co.jp%2Frakutenkobo-ebooks%2Fi%2F18341447%2F%3Fscid%3Daf_pc_bbtn&link_type=picttext&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIyNDB4MjQwIiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxfQ==)
コメント