Excel帳票出力
type: Concept
definition: 業務システムやWindowsアプリから、Excel形式(またはExcelを経由したPDF等)の帳票を作成すること。
alternative label: Excelレポート出力
uses: Excel COM自動化(Excel COM Interop)
uses: .xlsx直接生成

テンプレート差し込み方式
type: Concept
definition: 帳票の見た目・数式・印刷設定をExcelテンプレート側に持たせ、コードは名前付き範囲やテーブルへのデータ差し込みに徹する帳票出力方式。
alternative label: テンプレート+直接生成
recommended for: Excel帳票出力
uses: 名前付き範囲
uses: テーブル(ListObject)
uses: 一時ファイル経由の安全な保存パターン
uses: 明細あふれの例外化

Excel COM自動化(Excel COM Interop)
type: Concept
definition: C#などの外部プログラムからCOM経由でExcelアプリケーション本体を起動・操作する自動化方式。
alternative label: Excel Automation
alternative label: Office Automation(Excel)
not recommended for: サーバーサイドのOffice自動化

.xlsx直接生成
type: Concept
definition: Excelを起動せず、Open XML形式の.xlsxファイルをライブラリでプログラム側から直接組み立てる帳票出力方式。
alternative label: Excelファイル直接生成

サーバーサイドのOffice自動化
type: Concept
definition: ASP.NET、DCOM、NTサービスなど無人・非対話のクライアントアプリケーションやコンポーネントからOfficeアプリを自動操作すること。Microsoftは推奨せずサポートもしないと明言している。
alternative label: 無人・非対話のOffice Automation

ClosedXML
type: Concept
definition: Open XML APIの上にブック・シート・セルという直感的なAPIを被せた、Excelのインストールなしに.xlsx/.xlsmを扱えるMITライセンスのOSSライブラリ。
uses: Open XML SDK

Open XML SDK
type: Concept
definition: ECMA-376/ISO・IEC 29500として標準化されたOfficeのファイル形式を、Excel本体を起動せずに強く型付けされたクラスで読み書きできるMicrosoft製ライブラリ。
alternative label: DocumentFormat.OpenXml

NPOI
type: Concept
definition: JavaのApache POIを.NETへ移植した、.xlsの古い形式も扱えるApache License 2.0のOSSライブラリ。

EPPlus
type: Concept
definition: 高機能な.NET向けExcel操作ライブラリ。バージョン5以降はPolyform Noncommercialまたは商用ライセンスで、商用利用には有償ライセンスが必要になる。

名前付き範囲
type: Concept
definition: Excelでセルやセル範囲に付けられる名前で、セル番地の代わりにこの名前を通してデータの差し込み先を指定できる。
alternative label: Defined Name

テーブル(ListObject)
type: Concept
definition: Excelの「テーブルとして書式設定」で作る構造。行を追加すると書式と数式が自動で伸びるため、明細の入口に向く。
alternative label: Excelテーブル

Binder層
type: Concept
definition: 名前付き範囲やテーブルへ、ReportModelの値をTemplateの複製ブックへ書き込む層。ビジネス判断を持ち込まない。
alternative label: Binderレイヤー
uses: 名前付き範囲
uses: テーブル(ListObject)
requires: ReportModel層
requires: Template層

ReportModel層
type: Concept
definition: 帳票に必要な値を、セル番地を知らない形で整形して保持する層。DB/API/ファイルなどの生データを受け取る。
alternative label: ReportModel

Template層
type: Concept
definition: 帳票の見た目・数式・印刷設定・グラフを持つ.xlsx/.xlsmのテンプレートそのものを表す層。DBや業務ロジックを知らない。
alternative label: Templateレイヤー

Finisher層
type: Concept
definition: 必要なときだけVBA呼び出し・COM自動化・PDF化などを行う、Binderの後段に位置する層。元データ取得は行わない。
alternative label: Finisherレイヤー
requires: Binder層

一時ファイル経由の安全な保存パターン
type: Concept
definition: 出力先へ直接書かず、同じフォルダーの一時ファイルへ書き切ってからFile.Moveで本来のファイル名へ付け替える保存方式。
alternative label: Write-Temp-Then-Move
prevents: 途中で切れたファイルの残留リスク
uses: FileMode.CreateNew

途中で切れたファイルの残留リスク
type: Concept
definition: 出力先へ直接書き込んでいる途中でディスク満杯や共有切断などにより失敗すると、業務上のファイル名のまま不完全なファイルが残ってしまうリスク。

FileMode.CreateNew
type: Concept
definition: 指定したパスに既にファイルがある場合はIOExceptionを送出し、新規作成に失敗させる.NETのFileModeオプション。
prevents: 同名ファイルの黙った上書きリスク

同名ファイルの黙った上書きリスク
type: Concept
definition: 既に同名の帳票ファイルが存在するときに、それと気づかず上書きしてしまうリスク。

明細あふれの例外化
type: Concept
definition: テンプレートに用意した明細行数を明細件数が超えたとき、黙って切り捨てず例外を送出して処理を止める実装方針。
prevents: 明細の黙った切り捨てリスク

明細の黙った切り捨てリスク
type: Concept
definition: テンプレートの用意行数を超えた明細データが、エラーにならないまま切り捨てられて失われるリスク。

セル番地の業務仕様化
type: Concept
definition: Cells[12, 7]のようなセル番地に業務ルールを直接埋め込む実装。レイアウト変更がそのまま仕様変更になり壊れやすい。
alternative label: Cells[row, col]直書き
not recommended for: Excel帳票出力

Excel 1シートの上限(1,048,576行×16,384列)
type: Concept
definition: Excelの1ワークシートが持てる最大行数・列数の上限。明細が大きい場合はシート分割やファイル分割を先に決めておく必要がある。
alternative label: Excelの行数・列数上限

Microsoft Graph Excel API
type: Concept
definition: OneDrive/SharePoint上のExcelファイルをWeb/モバイルアプリなどから操作するMicrosoft Graphのブック・グラフ操作API。
alternative label: Graph Excel API

既存VBA資産を残す方式
type: Concept
definition: 既存の.xlsmやVBAマクロをブック側の振る舞いとして残し、データ取得や業務処理はC#/.NET側に分担させる帳票出力方式。
alternative label: VBA併用方式
uses: 名前付き範囲
uses: テーブル(ListObject)

subject: Excel帳票出力
predicate: uses
object: Excel COM自動化(Excel COM Interop)
description: Excel帳票出力の実装方式の1つとして、Excelアプリを実際に起動して操作するCOM自動化がある。
verified at: 2026-08-01
certainty: established

subject: Excel帳票出力
predicate: uses
object: .xlsx直接生成
description: Excel帳票出力の実装方式の1つとして、Excelを起動せず.xlsxを直接組み立てる直接生成がある。
evidence: about-the-open-xml-sdk
verified at: 2026-08-01
certainty: established

subject: テンプレート差し込み方式
predicate: recommendedFor
object: Excel帳票出力
description: 利用者があとでExcelを開いて編集する帳票では、テンプレート差し込み方式が第一候補として推奨される。
evidence: ClosedXML
verified at: 2026-08-01
certainty: established

subject: Excel COM自動化(Excel COM Interop)
predicate: notRecommendedFor
object: サーバーサイドのOffice自動化
description: Excel COM自動化をサーバーサイドのOffice自動化に用いることは、Microsoftが推奨せずサポートもしないと明言している。
verified at: 2026-08-01
certainty: established

subject: テンプレート差し込み方式
predicate: uses
object: ClosedXML
description: 本記事のサンプル実装では、テンプレート差し込み方式をClosedXMLで開いたテンプレートへ名前付き範囲経由で値を書き込む形で実装している。
evidence: ClosedXML
verified at: 2026-08-01
certainty: context-dependent

subject: ClosedXML
predicate: uses
object: Open XML SDK
description: ClosedXMLはOpen XML SDKの上に、ブック・シート・セルという直感的なインターフェイスを提供するラッパーである。
evidence: ClosedXML
verified at: 2026-08-01
certainty: established

subject: .xlsx直接生成
predicate: uses
object: Open XML SDK
description: xlsx直接生成をOpen XML SDKで実装する場合、ワークブック・シート・セル・スタイル・テーブルを直接操作する。4つは比較表の選択肢で、通常はどれか1つを選ぶ
evidence: about-the-open-xml-sdk
verified at: 2026-08-01
certainty: context-dependent

subject: .xlsx直接生成
predicate: uses
object: ClosedXML
description: xlsx直接生成をMITライセンスのラッパーであるClosedXMLで実装することもできる。4つは比較表の選択肢で、通常はどれか1つを選ぶ
evidence: ClosedXML
verified at: 2026-08-01
certainty: context-dependent

subject: .xlsx直接生成
predicate: uses
object: NPOI
description: xlsx直接生成を、.xlsの古い形式も扱えるNPOIで実装することもできる。4つは比較表の選択肢で、通常はどれか1つを選ぶ
evidence: npoi
verified at: 2026-08-01
certainty: context-dependent

subject: .xlsx直接生成
predicate: uses
object: EPPlus
description: xlsx直接生成を高機能なEPPlusで実装することもできるが、バージョン5以降は商用利用にライセンス費用が必要になる。4つは比較表の選択肢で、通常はどれか1つを選ぶ
evidence: EPPlus
verified at: 2026-08-01
certainty: context-dependent

subject: テンプレート差し込み方式
predicate: uses
object: 名前付き範囲
description: テンプレート差し込み方式では、コードは名前付き範囲を入口としてデータを書き込み、セル番地には依存しない。
verified at: 2026-08-01
certainty: established

subject: テンプレート差し込み方式
predicate: uses
object: テーブル(ListObject)
description: テンプレート差し込み方式では、行が自動で伸びるテーブル(ListObject)を明細の入口として使える。
verified at: 2026-08-01
certainty: established

subject: Binder層
predicate: uses
object: 名前付き範囲
description: Binder層は、名前付き範囲へReportModelの値を書き込む。
verified at: 2026-08-01
certainty: established

subject: Binder層
predicate: uses
object: テーブル(ListObject)
description: Binder層は、テーブル(ListObject)へReportModelの値を書き込む。
verified at: 2026-08-01
certainty: established

subject: Binder層
predicate: requires
object: ReportModel層
description: Binder層は、名前と値の組をReportModel層から受け取ることを前提とする。
evidence: open-xml-sdk-design-considerations
verified at: 2026-08-01
certainty: established

subject: Binder層
predicate: requires
object: Template層
description: Binder層は、複製したTemplate層のブックが持つ名前付き範囲やテーブルへ書き込むことを前提とする。
verified at: 2026-08-01
certainty: established

subject: Finisher層
predicate: requires
object: Binder層
description: Finisher層は、Binder層が値を書き込んだ後のブックを受け取ってPDF化やVBA呼び出しなどを行う。
evidence: open-xml-sdk-design-considerations
verified at: 2026-08-01
certainty: established

subject: Finisher層
predicate: uses
object: Excel COM自動化(Excel COM Interop)
description: Finisher層は、本当にExcelアプリの挙動(PDF化やマクロ呼び出し)が必要なときだけCOM自動化を使う。
verified at: 2026-08-01
certainty: context-dependent

subject: 一時ファイル経由の安全な保存パターン
predicate: prevents
object: 途中で切れたファイルの残留リスク
description: 同じフォルダーの一時ファイルへ書き切ってからFile.Moveで付け替えると、途中で失敗しても業務上のファイル名では不完全なファイルが残らない。
evidence: system.io.file.move
verified at: 2026-08-01
certainty: established

subject: 一時ファイル経由の安全な保存パターン
predicate: uses
object: FileMode.CreateNew
description: 一時ファイルへの書き込みはFileMode.CreateNewで行い、想定外の同名ファイルへの上書きを避ける。
evidence: system.io.filemode
verified at: 2026-08-01
certainty: established

subject: FileMode.CreateNew
predicate: prevents
object: 同名ファイルの黙った上書きリスク
description: FileMode.CreateNewは既存ファイルがあるとIOExceptionを送出するため、同名ファイルを黙って上書きすることを防ぐ。
evidence: system.io.filemode
verified at: 2026-08-01
certainty: established

subject: 明細あふれの例外化
predicate: prevents
object: 明細の黙った切り捨てリスク
description: 明細件数がテンプレートの用意行数を超えたときに例外を送出することで、明細が黙って切り捨てられるリスクを防ぐ。
evidence: system.invalidoperationexception
verified at: 2026-08-01
certainty: established

subject: セル番地の業務仕様化
predicate: notRecommendedFor
object: Excel帳票出力
description: Cells[12, 7]のようなセル番地を業務仕様として直書きすることは、レイアウト変更がそのまま仕様変更になるためExcel帳票出力には推奨されない。
verified at: 2026-08-01
certainty: established

subject: .xlsx直接生成
predicate: requires
object: Excel 1シートの上限(1,048,576行×16,384列)
description: 大量の明細を扱う直接生成では、1シートの上限(1,048,576行×16,384列)を踏まえてシート分割・ファイル分割の方針を先に決める必要がある。
verified at: 2026-08-01
certainty: context-dependent

subject: Microsoft Graph Excel API
predicate: notRecommendedFor
object: Excel帳票出力
description: Microsoft Graph Excel APIはOneDrive/SharePoint上の共同利用に用途が限定され、ローカルPC上の任意ファイルを量産する一般解ではないため、多くの帳票出力には推奨されない。
evidence: excel-concept-overview
verified at: 2026-08-01
certainty: context-dependent

subject: 既存VBA資産を残す方式
predicate: uses
object: 名前付き範囲
description: 既存VBA資産を残す方式では、VBA側と.NET側の境界を名前付き範囲で固定する。
verified at: 2026-08-01
certainty: established

subject: 既存VBA資産を残す方式
predicate: uses
object: テーブル(ListObject)
description: 既存VBA資産を残す方式では、VBA側と.NET側の境界をテーブル(ListObject)で固定する。
verified at: 2026-08-01
certainty: established

subject: テンプレート差し込み方式
predicate: uses
object: 一時ファイル経由の安全な保存パターン
description: テンプレート差し込み方式の保存では、一時ファイル経由の安全な保存パターンで出力先ファイルを確定させる。
evidence: system.io.file.move
verified at: 2026-08-01
certainty: established

subject: テンプレート差し込み方式
predicate: uses
object: 明細あふれの例外化
description: テンプレート差し込み方式の実装では、明細がテンプレートの用意行数を超えた場合に備えて明細あふれの例外化を行う。
evidence: system.invalidoperationexception
verified at: 2026-08-01
certainty: established