はじめに
こんちちは!
実務で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);
おわりに
この関数を一つ用意しておくだけで、帳票作成や自動集計ツールの開発効率は格段に上がるかと思います!
次は読み込みも作ってみようかと思います!