一日一膳(当社比)

RとJavaと時々数学

Node.jsでexcelからデータ抽出してjsonにするプログラムかいてみた

どうもこんにちは.

最近冷やし中華ばかりたべている管理人です.

今日は,Node.jsでexcel操作するライブラリxlsx - npmexcelから抽出したデータをjson形式に書くプログラムをかいてみたのでメモとして残しておきます.

1.目的

次のような,excelシートsample.xlsxから各行をjson形式で取得して, test.xlsxに保存する プログラムを作成します.

firstname lastname
Takeshi Goda
Shizuka Minamoto
Honeo Sunekawa

javascriptコード


'use strict';

let ParseExcel = function() {
    this.methods = {};
    this.table = [];
};

ParseExcel.prototype = {
    /**
     * Excelから取得するデータのフィールド名と取得する関数
     * @param {string} fieldName 
     * @param {function getField(index, worksheet) {}}
     */
    setMethods:function(fieldName, getField) {
        this.methods[fieldName] = getField;
        return this;
    },
    /**
     * worksheet
     * @param {Array} rows worksheetからデータ取得する行番号
     * @param {*} worksheet ワークシート
     */
    setTable:function(rows, worksheet) {    
        rows.forEach((index) => {
            let record = {};
            Object.keys(this.methods).forEach((field) => {
                record[field] = this.methods[field](index, worksheet);
            });
            this.table.push(record);
        });
        return this;
    },
    /**
     * 取得したデータの取得
     */
    getTable:function() {
        return this.table;
    }
};

let parseExcel = new ParseExcel();

/** フィールドと取得関数を設定 */
parseExcel.setMethods('firstName', (index, worksheet) => {
    let cell = worksheet[`A${index}`];
    return !cell ? undefined : cell.v;
}).setMethods('lastName', (index, worksheet) => {
    let cell = worksheet[`B${index}`];
    return !cell ? undefined : cell.v;
})

const XLSX = require("xlsx");
// Workbookの読み込みや
const book = XLSX.readFile(__dirname + "/sample.xlsx");
// Sheet1を読み込むんや
const sheet1 = book.Sheets["Sheet1"];
//末端行を取得するで
let rowMax = XLSX.utils.decode_range(sheet1['!ref']).e.r

//sheet1の内容を取得するんや
let table = parseExcel.setTable(
    [...Array(rowMax).keys()].map((i) =>  i+2), sheet1)
    .getTable()

console.log(table);

//新規ワークブックや
let wb = XLSX.utils.book_new()
let sheetNew = XLSX.utils.json_to_sheet(table, 
    {header:['firstName','lastName'], skipHeader:false})

//newシートに保存するで
XLSX.utils.book_append_sheet(wb, sheetNew, "new")

//test.xlsxに保存するんや
XLSX.writeFile(wb, "test.xlsx")
    

2.動作確認

nodeで実行してみると次のようになります.

[ { firstName: 'Takeshi', lastName: 'Goda' },
  { firstName: 'Shizuka', lastName: 'Minamoto' },
  { firstName: 'Honeo', lastName: 'Sunekawa' } ]

3.最後に

実は今回利用したsample.xlsxのように普通の形をした表データの整形なら XLSX.utils.sheet_to_jsonとか使えば良いと思いますが,取得したいセルの位置 が飛び飛びであるみたいなにも対応できるように実装しました.今後ももう少しxlsxライブラリの練習をしていきたいと思います...