もう、Excel 帳票は怖くない。
出力も取込も「一撃」
Excel 帳票開発の常識を変える実務特化型エンジン
Core:
ClosedXml Provider:
NPOI Provider:
開発が爆速になる、3 つの「一撃」をご紹介します。
※ ExcelConductor は Excel の API を便利に包むライブラリではありません。
実務帳票が持つ「構造」そのものを抽象化し、出力も取込も同一思想で扱える設計です(詳細は後述)。
「テンプレートにデータを流し込む」 という設計です。
テンプレートに予約語を配置し、モデルを Bind するだけで帳票出力は完了です。
一覧の方向 (縦・横) も、一段・多段の出力も可能です。
var engine = new WorkbookEngine("template.xlsx");
engine.Bind(model);
engine.Save("output.xlsx");※ 予約語の設定方法は後述します。
※ モデル定義や属性指定の詳細は、/samples を参照してください。
「モデル定義から一覧構造を解析する」 という設計です。
開始位置を指定するだけで、指定モデルに内容を取り込みます。
一覧の方向 (縦・横) も、一段・多段の取込も可能です。
var engine = new WorkbookEngine("template.xlsx");
var collection = engine.Read<OrderDetail>(startRow: 9);※ モデル定義や属性指定の詳細は、/samples を参照してください。
using を切り替えるだけで、ライブラリの変更が可能です。
「とりあえず、ClosedXML で開発を始め、要件によって NPOI に切り替える」
そんな「意思決定の先送り」を可能にします。
// ClosedXML を使いたい場合
// using CTF.ExcelConductor.ClosedXml;
// NPOI を使いたい場合
using CTF.ExcelConductor.Npoi; // ← この 1 行を変えるだけで Provider が切り替わりますBind 後の微調整など、業務で使用する Excel 操作は完備しております。
どのライブラリでも I/F は変わりません。
// Bind 後に特定の範囲をグレーアウト
engine.SetBackColor(new SingleCell("E5"), Color.LightGray);
// テンプレートの崩れや、強調したい境界に罫線を引き直す
engine.DrawLine(new CellRange("A1:E10"), BorderPoint.Bottom, LineStyle.Thick);
// 列や行のサイズ調整も直感的に
engine.SetColumnWidth(new ColumnRange("B:D"), 15);
engine.SetRowHeight(new RowRange("1:3"), 25);ExcelConductor は、テンプレート上の ${} で囲まれた予約語を解析してバインドします。
特定のプロパティ値を埋め込みます。
${Name}
${Price|Format=#,##0}
Format の動作と型変換
テンプレートの書き方によって、出力結果の「型」の扱いが変わります。
- 完全一致 (例:セルに
${Price}のみ記述)- パイプによる Format は適用されず、Excel 側のセルの書式設定が優先されます。
- 数値型や日付型としてそのまま書き込まれるため、計算式などの対象として保持したい場合に適しています。
- 部分一致 (例:セルに
価格:${Price|Format=#.##}円と記述)- 指定した Format に基づき、文字列として置換されます。
コレクション (IEnumerable) を展開します。レコードの開始位置となるセルに記述してください。
${VList|Items|RowSpan=1|Mode=Copy}
${HList|Items|ColSpan=2|Mode=Insert}
| オプション | 説明 | 備考 |
|---|---|---|
| Format | リスト内の数値・日付に適用する一括フォーマット。 | Scalar 専用 |
| RowSpan | 1 レコードが占有する行数 (多段ならここを増やすだけ) | VList 専用 |
| ColSpan | 1 レコードが占有する列数 (多段ならここを増やすだけ) | HList 専用 |
| Mode | Copy (既存行の書式を流用) または Insert (行を差し込みながら展開) | VList/HList 専用 |
Excel を操作するライブラリは数多く存在しますが、
「実務帳票の本質を抽象化して扱う」 という領域はこれまで体系化できていませんでした。
開発者が向き合うべきはライブラリの API 仕様ではなく、Excel そのものの仕様であるべきです。
Excel 操作の本質を捉え、直感的な仕組みとして提供すること。
ExcelConductor はその領域に挑むために生まれた OSS です。
本章は設計思想・Provider 実装者向けの説明です。
特定の Excel ライブラリに依存しない設計を採用しています。
Core 層は Excel の論理構造だけを扱い、Provider は I/O のみを担当します。
ExcelConductor の世界では、常に 1-based の純粋な座標体系 が保証されます。
- シート:1 始まり (Sheet1 = 1)
- 行:1 始まり
- 列:1 始まり (または "A" 始まり)
- 「0-based ライブラリ」と「1-based ライブラリ」の混在による 1 行ズレ (オフバイワン・エラー) を Core 層が水際で完全に遮断します。
Provider は Excel 操作の核心だけに集中できるよう設計されています。
- Provider が受け取るのは、Core 層によって
正規化・バリデーション・検疫 が完了した 「完全に安全なインデックス」 のみ。 - Provider 実装者はガードを一切書く必要がありません。
- シート名が正しいか
- 座標が負数でないか
- 範囲が逆転していないか
実務における「入力データの汚れ」と「出力の厳密さ」を両立させています。
- 入力 (Read/Cast)
全角数字、NBSP (不吉な空白) 、国ごとの日付形式などを自動吸収して .NET 型へ変換します。 - 出力 (Bind)
InvariantCulture でテンプレートの Format を適用し、意図しない文化圏依存の表記崩れを防ぎます。
ExcelConductor は迷わない使い方と、直感的な I/F を徹底しております。
ネストプロパティは属性の設定方法が直感的ではなくなるため、サポートしておりません。
ExcelConductor は「明示的」「壊れない設計」を軸に、実務帳票の生産性をさらに高めるための改善を続けます。
- どのセルで何が起きたかをより明確に
- テンプレートの不整合を早期に検出
- 利用者が原因を特定しやすいガイドを追加
- よくある帳票パターンのテンプレート例
- グラフ連動のサンプル
- VList/HList のベストプラクティス
- RowSpan/ColSpan の実務例
- ClosedXML / NPOI 以外の別エンジンでの動作を検討
- .NET の環境に応じた柔軟な選択肢を提供
ExcelConductor は拡張性を重視して設計されています。
特に Provider は差し替え可能な構造になっており、ClosedXML / NPOI 以外の Provider の追加も歓迎しています。
Issue や Pull Request も大歓迎です。
MIT License
ExcelConductor は、福岡を拠点とする開発チーム
Cyber Task Force (株式会社 CTF) によって開発・メンテナンスされています。
私たちは、単にコードを書くチームではありません。
「複雑な業務をいかに抽象化し、美しく堅牢な設計に落とし込むか」
その思考のプロセスと、現場の泥臭い課題を解決しきる完遂力が私たちの強みです。
「ExcelConductor を作れるチーム」 と一緒に、難易度の高い課題を解決しませんか?
