【Nuxt】Excelファイルを読み込む(vue-js-xlsx)
Excelファイルのデータをアップロードして、DBに登録する処理をしたいと思い、Nuxt.jsでExcelファイルを読み込むことができるようにしたので、備忘録として残しておく。
- Nuxt.js:v2.15.8
- Nuxt Buefy:v0.4.7
- vue-js-xlsx:v0.0.2
vue-js-xlsx
今回は、Excelの表形式での表示や編集などは考えておらず、Excelファイルからデータを読み取ることができれば機能としては十分であったので、vue-js-xlsx
を使うことにした。
以下の vue-xlsx
はコンポーネントまであってとても使いやすそうではあったが、今回の使用においてはコンポーネントまでは不要であったので選択肢から除外した。(もし複数のシートからいずれかを選択するなどの処理が必要な場合は、vue-xlsx
をオススメする。)
インストール
まずは、ライブラリをインストールする。
// npm npm install --save vue-js-xlsx // yarn yarn add vue-js-xlsx
Nuxt.js(Vue.js)で使うことができるように設定する。
plugins/vue-js-xlsx.js
ファイルを作成し、nuxt.config.js
設定ファイルで読み込ませる。そうすることで、this.$xlsx
でどこからでも読み出すことができる。
import Vue from 'vue' import VueXlsx from 'vue-js-xlsx' Vue.use(VueXlsx)
export default { ... /* ** Plugins to load before mounting the App */ plugins: [{ src: '@/plugins/vue-js-xlsx.js', ssr: false }] ... }
Excelデータをjsonデータに変換する
このライブラリ唯一の以下のメソッドを用いる。
const jsonData = this.$xlsx.toJson(data, options)
- data[Blob]:Excelファイル
- options[Object]:設定
- parsingOpts[Object]:読み取り時の設定
- XLSX.read(data, read_opts)のParsing Optionsを指定する
- type:Input data encodingを指定する
- base64, binary, string, buffer, array, file
- sheetIndex[Number]:出力したいシート番号を指定する
- parsingOpts[Object]:読み取り時の設定
実装例
UIライブラリに関しては、Nuxt Buefyを採用した。 実装例では、Excelファイルを読み込み、console.logで出力して確認するまでになっている。
<template> <section class="section"> <div class="box"> <b-field label="ファイル(.xlsx)を選択してください"> <b-upload v-show="!dropFile" v-model="dropFile" expanded drag-drop @input="arrangeData"> <section class="section"> <div class="content has-text-centered"> <p> <b-icon icon="upload" size="is-large"> </b-icon> </p> <p>Drop your files here or click to upload</p> </div> </section> </b-upload> </b-field> <div class="tags"> <span class="tag is-info" v-if="!!dropFile" > {{dropFile.name}} <button class="delete is-small" type="button" @click="deleteDropFile"> </button> </span> </div> </div> </section> </template> <script> export default { data() { return { dropFile: null, } }, methods: { deleteDropFile() { this.dropFile = null }, arrangeData() { const reader = new FileReader() const load = () => { const jsonData = this.$xlsx.toJson(reader.result, { parsingOpts: { type: 'array' }, sheetIndex: 1 }) console.log(jsonData) // jsonデータを必要な形に整形する } reader.onload = load reader.readAsArrayBuffer(this.dropFile) } } } </script>
(おまけ)VueでのCSVデータの読み込み
CSVデータを読み込む場合は、JSのライブラリのみで実装することができる。(今回、機能拡張をする前までは、CSVのみでの読み取りを可能としていた。)上記と異なるのは、以下のarrangeData
のmethodの部分のみである。
<script> arrangeData() { const reader = new FileReader() const load = () => { const lines = reader.result.split('\n') console.log(lines) // 文字列データを必要な形に整形する } reader.onload = load reader.readAsText(this.dropFile) } </script>
まとめ
これまでは、Excelデータを一度CSVデータに変換してから読み込みをさせていたので、直接Excelデータをアップロードすることができ、作業効率は格段に向上した。
vue-js-xlsx
のライブラリに感謝しかない。本当に必要最低限のみのメソッドではあるが、お陰様で無事に実装できて一安心である。