なんだかGoodVibes

日々の勉強メモです。

【Node】エクセルに書き込む(ループで回して書き込み)

こんにちは。
前回の続きです。
今回は、前回の内容を応用して書き込みを行います。
前回の内容はこちらを参考に。

nandakagoodvibes.hatenablog.com

今回使用するエクセルは前回と同じです。
では、サンプルです。

var xlsx = require('xlsx');

var book = xlsx.readFile('sample.xlsx');
var ws = book.Sheets['Sheet1'];

var range = ws['!ref'];

var decodeRange = xlsx.utils.decode_range(range);

for (var colIdx = decodeRange.s.c; colIdx <= decodeRange.e.c; colIdx++) {
    for (var rowIdx = decodeRange.s.r; rowIdx <= decodeRange.e.r; rowIdx++) {

        var address = xlsx.utils.encode_cell({ r: rowIdx, c:colIdx });
        var cell = ws[address];

        if (typeof cell !== "undefined" && typeof cell.v !== "undefined") {
            ws[address] = {t : 's', v : 'chg:' + address, w : 'chg:' + address};
        } else {
            ws[address] = {t : 's', v : 'add:' + address, w : 'add:' + address};
        }
    }
}

book.Sheets['Sheet1'] = ws;
xlsx.writeFile(book, 'sample.xlsx');


結果はこんな感じ。 f:id:nandakagoodvibes:20191222113940p:plain


詳細を見ていきましょう。

準備

こちらは前回の記事でも紹介しているので今回は割愛。

var xlsx = require('xlsx');

var book = xlsx.readFile('sample.xlsx');
var ws = book.Sheets['Sheet1'];

var range = ws['!ref'];

var decodeRange = xlsx.utils.decode_range(range);

ループで回して値を設定

ループの部分は前回の記事で紹介しているので割愛。

for (var colIdx = decodeRange.s.c; colIdx <= decodeRange.e.c; colIdx++) {
    for (var rowIdx = decodeRange.s.r; rowIdx <= decodeRange.e.r; rowIdx++) {
        .....
    }
}


次に、アドレスの取得。
これも前回紹介したので割愛。

var address = xlsx.utils.encode_cell({ r: rowIdx, c:colIdx });
var cell = ws[address];


最後が値の設定処理です。
今回は、すでに値がある場合は「chg:アドレス」
空の場合は「add:アドレス」を書き込みます。

if (typeof cell !== "undefined" && typeof cell.v !== "undefined") {
        ws[address] = {t : 's', v : 'chg:' + address, w : 'chg:' + address};
} else {
        ws[address] = {t : 's', v : 'add:' + address, w : 'add:' + address};
}

ブックを更新して書き込み

最後に設定した値をブックに書き込みます。
これをしないとせっかく設定した値が書き込まれないので
忘れないでくださいね。

book.Sheets['Sheet1'] = ws;
xlsx.writeFile(book, 'sample.xlsx');


以上です。
エクセルは使うことがたくさんあると思うので
覚えておくといいですね。