0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Node.js】ExcelJSで特定セルに一括書き込みする汎用関数を作ってみた

Last updated at Posted at 2026-01-07

はじめに

こんちちは!

実務でNode.jsを使ってExcelファイルを操作するためにExcelJSを使うことになりましたので、メモ用に投稿します!

毎回「ファイルを開いて、シートとセルを指定して、値をセットして、保存して…」と書くのは面倒だったので、「ファイル名、シート名、セル番地、値」を渡すだけで、複数のセルへ一括で書き込みができる汎用関数を作成しました。
おまけで「数値判定」や「数式セルへの考慮」も盛り込んでいます。

1. 作成した汎用関数

引数に dataMap というオブジェクトを渡すことで、複数のセルを一度に更新できるようにしています。

const ExcelJS = require('exceljs');

/**
 * Excelの特定シート・特定セルへ値を一括出力する汎用関数
 * @param {string} fileName - ファイルパス
 * @param {string|number} sheetNameOrId - シート名またはID
 * @param {Array} dataList - 書き込みデータのリスト(後述の形式)
 * @param {string} [outputFileName] - 保存先パス
 */
async function writeToExcelAdvanced(
  fileName,
  sheetNameOrId,
  dataList,
  outputFileName = fileName
) {
  const workbook = new ExcelJS.Workbook();

  try {
    await workbook.xlsx.readFile(fileName);
    const worksheet = workbook.getWorksheet(sheetNameOrId);

    if (!worksheet)
      throw new Error(`シート「${sheetNameOrId}」が見つかりません。`);

    // dataList: [{ target: 'A1', value: 'xxx' }, { target: [3, 2], value: 'yyy' }]
    dataList.forEach((item) => {
      let cell;
      if (Array.isArray(item.target)) {
        // [行, 列] の数値指定の場合
        cell = worksheet.getCell(item.target[0], item.target[1]);
      } else {
        // 'A1' などのアドレス指定の場合
        cell = worksheet.getCell(item.target);
      }

      // 数値判定と型変換
      const val = item.value;
      if (val !== null && val !== '' && !isNaN(Number(val))) {
        cell.value = Number(val);
      } else {
        cell.value = val;
      }
    });

    await workbook.xlsx.writeFile(outputFileName);
    console.log(`成功: ${outputFileName} を更新しました。`);
  } catch (error) {
    console.error('エラー:', error.message);
  }
}

2.使い方

この関数を使えば、メイン処理が驚くほどスッキリします。
シートは名前と番号両方指定可能です。
セルは行・列番号で指定も可能です

// --- 使い方 ---
const myData = [
  { target: 'A1', value: 'タイトル' }, // アドレスで指定
  { target: [3, 2], value: 12345 }, // 3行目、2列目(B3)を数値で指定
  { target: [4, 2], value: '678.9' }, // 4行目、2列目(B4)を数値で指定
];

writeToExcelAdvanced('sample.xlsx', 1, myData);

おわりに

この関数を一つ用意しておくだけで、帳票作成や自動集計ツールの開発効率は格段に上がるかと思います!
次は読み込みも作ってみようかと思います!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?