Node.jsでexceljsを使ってエクセルを出力する

技術情報

はじめに

業務系アプリケーションを作っているとエクセルで出力してほしいという要望はたくさんあります。そいうときは、PHPであればPhpSpreadsheet、JavaであればApache POIを使用してきました。

Node.jsでは、実用に耐えるエクセルライブラリが最近までなかったですが、だいぶ改善されてきたようです。

今回はexceljsライブラリを紹介しようと思います。

exceljsとは

GitHub - exceljs/exceljs: Excel Workbook Manager
Excel Workbook Manager. Contribute to exceljs/exceljs development by creating an account on GitHub.

Read, manipulate and write spreadsheet data and styles to XLSX and JSON.
Reverse engineered from Excel spreadsheet files as a project.

エクセルのスプレッドシートを書いたり読んだりできるライブラリですね。

似たようなライブラリとしてSheetJS js-xlsxもあるのですが、今回はexceljsを使用します。

exceljsのインストール

yarn add exceljs

もしくは

npm install --save exceljs

でプロジェクトにインストールします。

エクセルファイルの読み込みと書き込み

今回は、履歴書のエクセルを編集するという題材で進めます。

プロジェクトのtemplate/rirekisho.xlsxに履歴書のテンプレートとなるエクセルがある想定です。
使用したのはこんなテンプレートです。

import * as ExcelJS from 'exceljs';

async function main(){
  const template_filename = 'template/rirekisho.xlsx';
  const output_file = 'output.xlsx';

  // エクセルのテンプレートを開く
  const workbook = new ExcelJS.Workbook();
  await workbook.xlsx.readFile(template_filename);

  // エクセルを保存
  await workbook.xlsx.writeFile(output_file);
}

main();

単純に開いて、output.xlsxに保存するプログラムです。
簡単ですね。
大事なことは、output.xlsxを見てもエクセルが崩れて無いことです。数年前だと罫線が消えたりスタイルが崩れてたんですが、崩れずにコピーできています。

文字の入力

今度は履歴書の名前の入力です。セルD7に名前を入れます。

  // 最初のシートを取り出す
  const worksheet = workbook.worksheets[0];

  // 文字を書く
  const name_range = "D7";
  worksheet.getCell(name_range).value = 'テスト テスト';

workbookからworksheetsを取り出して、getCellメソッドでセルを指定し、valueに書き込みます。
やっぱり簡単ですね。

画像を入れる

履歴書なので、証明写真を貼りたいところです。
みんな大好きいらすとやから証明写真を取ってきて、template/photo.pngというファイルで保存しました。
エクセルで証明写真を貼る場所はH3:H10です。

  // 画像を貼る
  const photo_filename = 'template/photo.png';
  const imageId1 = workbook.addImage({
    filename: photo_filename,
    extension: 'png',
  });
  const photo_range = 'H3:H10';
  worksheet.addImage(imageId1, photo_range);

やってることは、画像をexceljsの専用メソッド workbook.addImageで開いてから、worksheet.addImageで画像を挿入しています。

出力結果

最終的なコードはこうなりました。

import * as ExcelJS from 'exceljs';

async function main(){
  const template_filename = 'template/rirekisho.xlsx';
  const output_file = 'output.xlsx';

  const photo_filename = 'template/photo.png';
  const name_range = "D7";
  const photo_range = 'H3:H10';

  // エクセルのテンプレートを開く
  const workbook = new ExcelJS.Workbook();
  await workbook.xlsx.readFile(template_filename);

  // 最初のシートを取り出す
  const worksheet = workbook.worksheets[0];

  // 文字を書く
  worksheet.getCell(name_range).value = 'テスト テスト';

  // 画像を貼る
  const imageId1 = workbook.addImage({
    filename: photo_filename,
    extension: 'png',
  });
  worksheet.addImage(imageId1, photo_range);

  // エクセルを保存
  await workbook.xlsx.writeFile(output_file);
}

main();

出力されたエクセルの結果です。

これなら、テンプレートを作成して、エクセルの帳票を出力できそうですね。
いい感じです。
履歴書を作成してくれるサービスなんかも作れそうな感じです。

今回のプログラムはgithubにあげてあります。

GitHub - Haramoto/rirekisyo-exceljs
Contribute to Haramoto/rirekisyo-exceljs development by creating an account on GitHub.

まとめ

exceljsでエクセルファイルの読み込み、書き込み、画像の挿入などを行いました。
Node.jsでエクセルの帳票が作れるのは嬉しいですね。

electronに仕込めば、デスクトップアプリケーションでエクセルを出力するというもの作れますし。いろいろ使えそうですね。

コメント

タイトルとURLをコピーしました