waveさんの技術日誌

wave1008の日記の新館です。

Node.jsでexceljsを使う(その1)

Node.jsでExcelの処理をしたいと思いました。

いろいろライブラリがあるのですが、APIが直感的なのでexceljsがよさげだと思いました。

https://www.npmjs.com/package/exceljs#reading-xlsx

でも、このドキュメントはちょっと不親切なので、初心者にはわかりにくいです。そもそもNode.jsそのものに慣れていないので、非同期I/Oの扱いがよくわからんでかなり悩みました。以下の記事を読んでPromiseパターンを理解すると、だんだん書き方が分かってきました。

 

参考にした記事

俺たちはJavaScriptの非同期処理とどう付き合っていけば良いのだろうか - Qiita

JavaScript Promiseの本

 

試しにTypeScriptでサンプルコードを書いてみました。


// exceljsで複数のExcelファイルを読み込んでファイルとシートの一覧を作成する
// TypeScriptのサンプルです。

import * as Excel from 'exceljs';
import * as path from 'path';
import * as fs from 'fs';

// 処理対象のExcelファイルのリストを作成します。
let dataDir = path.resolve("testdata");
let filelist = fs.readdirSync(dataDir).map(f => { return path.join(dataDir, f); });

// exceljsはファイルの読み込みに非同期のメソッドしか提供していないので、promiseパターンで実装します。
// まず、ファイルリストに対応してWorkbookの読み込みを行うPromiseのリストを作成します。
let promises = filelist.map(file => {
    let workbook = new Excel.Workbook();
    return workbook.xlsx.readFile(file) // readFileはPromiseを拡張したPromishを返します。
        .then(() => {
            // workbookにはfileの情報が含まれないので、fileとペアにしてresolveします。
            return Promise.resolve({ file: file, workbook: workbook });
        });
});

// すべてのPromiseを実行します。
Promise.all(promises)
    .then(function (results) {
        // ファイル、シートID、ワークシート名をコンソールに出力します。
        results.forEach((x) => {
            let workbook = x.workbook;
            workbook.eachSheet((worksheet, sheetId) => {
                console.log(x.file + "," + sheetId + "," + worksheet.name);
            });
        });
    }).catch(function (err) {
        console.log(err);
    });

実行結果

f:id:wave1008:20170524012314p:plain

 

いい感じじゃないですか。

exceljsでExcelの処理がどこまでできるか興味あります。