C# アプリケーションにおいて、UI コントロールに表示されている表形式データを Excel にエクスポートすることは、非常に一般的な要件です。WinForms や ASP.NET プロジェクトでは、DataGrid、DataGridView、GridView に現在表示されているデータを、レポート作成や共有、後続処理のために Excel ファイルとして出力したいケースが多くあります。 実際の業務では、エクスポートされた Excel ファイルは単なる生データとして使われることはほとんどありません。読みやすいレイアウト、表ヘッダーの書式、適切な列幅、数値や日付の表示形式などが求められるのが一般的です。 本記事では、Spire.XLS for .NET を使用し、Microsoft Office Interop を使用せずに、C# で DataGridView および GridView / DataGrid のデータを Excel にエクスポートする方法を解説します。表示中のデータを正確に出力しつつ、実装をシンプルに保ち、Excel 側で一貫した書式設定を行うことに重点を置いています。 目次 C# でプログラムから Excel をエクスポートするメリット 基本コンセプト:表示データを DataTable 経由でエクスポートする 手順 1:表示中のデータを DataTable に変換する 手順 2:C# で DataTable を Excel にエクスポートする 手順 3:エクスポートした Excel ファイルに書式を適用する パフォーマンスおよび実運用上の注意点 まとめ FAQ C# でプログラムから Excel をエクスポートするメリット Microsoft Office Interop を使用して Excel ファイルを生成することも可能ですが、DataGrid、DataGridView、GridView からデータを出力する場合、プログラムによるエクスポートには以下のような明確な利点があります。 実行環境に Microsoft Excel をインストールする必要がない サーバー環境やクラウド環境に適している 大量データを扱っても高いパフォーマンスを維持できる 自動処理やバックグラウンドでのエクスポートに向いている コードベースで直接 Excel を生成することで、安定性・保守性・拡張性に優れたエクスポート機能を、さまざまなアプリケーションで一貫して提供できます。 基本コンセプト:表示データを DataTable 経由でエクスポートする DataGrid、DataGridView、GridView はいずれも UI コントロールですが、本質的には行と列で構成された構造化データを表示するためのものです。これらのコントロールを直接エクスポートしようとすると、UI に依存したロジックになりやすく、保守性が低下します。 そこで推奨されるのが、次のようなワークフローです。 画面表示データ → DataTable → Excel ファイル この設計では、 DataTable がユーザーに表示されている内容を正確に表現する Excel 出力処理を UI レイヤーから分離できる WinForms と ASP.NET の両方で同じ実装を利用できる 書式やレイアウトは Excel 側で一元管理できる DataTable は最終的な出力先ではなく、中間データ構造として機能します。Spire.XLS for .NET を使用すれば、DataTable を書式付きの Excel ファイルとして簡単にエクスポートできます。 手順 1:表示中のデータを DataTable に変換する 最初のステップでは、UI コントロールに 現在表示されているデータ を取得し、DataTable に変換します。ここでは元のデータソースを再構築するのではなく、表示内容そのものを取得することが重要です。 DataGridView(WinForms)から表示データを取得する WinForms アプリケーションでは、ユーザーは画面に表示されている DataGridView の内容と同じデータがエクスポートされることを期待します。以下のメソッドは、表示中の DataGridView データを DataTable に変換します。 DataTable ConvertDataGridViewToDataTable(DataGridView dgv) { DataTable dt = new DataTable(); foreach (DataGridViewColumn column in dgv.Columns) { dt.Columns.Add(column.HeaderText, column.ValueType ?? typeof(string)); } foreach (DataGridViewRow row in dgv.Rows) { if (row.IsNewRow) continue; DataRow dr = dt.NewRow(); for (int i = 0; i < dgv.Columns.Count; i++) { dr[i] = row.Cells[i].Value ?? DBNull.Value; } dt.Rows.Add(dr); } return dt; } この方法により、列ヘッダー、列順、表示されている値を保持したまま、DataGridView のデータを Excel にエクスポートできます。 GridView(ASP.NET)から表示データを取得する ASP.NET アプリケーションでは、GridView コントロールが表形式データの表示に使用されます。表示中の GridView データをエクスポートする場合、以下のようにレンダリングされた行を DataTable に変換できます。 DataTable ConvertGridViewToDataTable(GridView gv) { DataTable dt = new DataTable(); foreach (TableCell cell in gv.HeaderRow.Cells) { dt.Columns.Add(cell.Text); } foreach (GridViewRow row in gv.Rows) { DataRow dr = dt.NewRow(); for (int i = 0; i < row.Cells.Count; i++) { dr[i] = row.Cells[i].Text; } dt.Rows.Add(dr); } return dt; } この方法を使えば、UI に依存した処理を増やすことなく、C# で GridView のデータを Excel にエクスポートするための共通データ構造を用意できます。 なお、データベースから直接 Excel に出力したい場合は、こちらの記事も参考にしてください: C# でデータベースを Excel にエクスポートする方法 手順 2:C# で DataTable を Excel にエクスポートする 表示データを DataTable に変換できたら、あとは UI に依存しない形で Excel ファイルを生成するだけです。 ここでは Spire.XLS for .NET を使用し、Microsoft Excel をインストールせずに Excel ファイルを作成します。 Spire.XLS for .NET のインストール NuGet を使用してインストールできます。 Install-Package Spire.XLS または、Spire.XLS for .NET をダウンロードして、手動でプロジェクトに追加することも可能です。 基本的な Excel エクスポート例 using Spire.Xls; Workbook workbook = new Workbook(); Worksheet worksheet = workbook.Worksheets[0]; // 列ヘッダーを含めて DataTable を Excel に挿入 worksheet.InsertDataTable(exportTable, true, 1, 1); // Excel ファイルを保存 workbook.SaveToFile("ExportedData.xlsx", ExcelVersion.Version2016); エクスポート結果の Excel ファイルは以下のようになります。 このエクスポート処理は、DataGrid、DataGridView、GridView のいずれにもそのまま再利用できます。 手順 3:エクスポートした Excel ファイルに書式を適用する Excel へのエクスポートでは、データの出所に関わらず、書式設定が重要になります。スタイルの適用、列幅の調整、数値書式の設定により、ファイルの可読性と実用性が大きく向上します。 以下は、エクスポートしたワークシートに対して適用できる代表的な書式設定の例です。 CellStyle headerStyle = workbook.Styles.Add("HeaderStyle"); headerStyle.Font.IsBold = true; headerStyle.Font.FontName = "Yu Gothic UI"; headerStyle.Font.Size = 12f; headerStyle.HorizontalAlignment = HorizontalAlignType.Center; headerStyle.VerticalAlignment = VerticalAlignType.Center; CellStyle dataStyle = workbook.Styles.Add("DataStyle"); dataStyle.Font.FontName = "Yu Gothic UI"; dataStyle.Font.Size = 11f; // ヘッダーのスタイルを適用 CellRange headerRange = worksheet.Range[1, 1, 1, ordersTable.Columns.Count]; headerRange.Style = headerStyle; // データ行のスタイルを適用 worksheet.Range[2, 1, worksheet.LastRow, worksheet.LastColumn].Style = dataStyle; // 列幅と行高を自動調整 worksheet.AllocatedRange.AutoFitColumns(); worksheet.AllocatedRange.AutoFitRows(); // 日付と通貨の書式を設定 worksheet.Range[$"D2:D{worksheet.LastRow}"].NumberFormat = "#,##0"; worksheet.Range[$"E2:E{worksheet.LastRow}"].NumberFormat = "¥#,##0.00"; worksheet.Range[$"F2:G{worksheet.LastRow}"].NumberFormat = "yyyy-mm-dd"; 書式適用後の Excel ファイルの例は以下のとおりです。 これらの書式設定は、レポート要件に応じて自由に組み合わせたり拡張したりできますが、データ抽出ロジックを変更する必要はありません。 Spire.XLS for .NET は、条件付き書式やグラフなど、さらに高度な Excel 機能にも対応しています。詳しくは、C# で Excel ファイルを作成する方法をご参照ください。 パフォーマンスおよび実運用上の注意点 大量の DataGrid または GridView データをエクスポートする場合は、以下の点に注意するとよいでしょう。 デスクトップアプリでは非同期処理でエクスポートを実行する Excel 生成中に UI スレッドをブロックしない 必要な列、または表示中の列のみをエクスポートする ASP.NET アプリケーションではサーバー側で Excel ファイルを生成する エクスポート処理は UI コントロールではなく DataTable を基盤としているため、データ量が増えても保守性・拡張性を維持できます。 まとめ C# で DataGrid、DataGridView、GridView のデータを Excel にエクスポートする際、Microsoft Office Interop は必須ではありません。表示中のデータを DataTable に変換し、プログラムから Excel ファイルを生成することで、安定性と再利用性の高いエクスポート機能を実装できます。 UI とエクスポート処理を明確に分離し、書式設定にも柔軟に対応できるこの方法は、デスクトップアプリケーションおよび Web アプリケーションの実務的なレポート作成に適しています。ライブラリの評価や動作確認を行う場合は、一時ライセンスを申請することも可能です。 FAQ Q1:C# で DataGridView のデータを Excel にエクスポートするにはどうすればよいですか? A1:表示中の DataGridView データを DataTable に変換し、Spire.XLS for .NET を使用してプログラムから Excel ファイルを生成すれば、Microsoft Excel に依存せずにエクスポートできます。 Q2:GridView を Excel にエクスポートする際に書式を設定できますか? A2:はい。Spire.XLS を使用すれば、スタイルの適用、列幅の調整、数値書式の設定などを行い、読みやすく実用的な Excel レポートを作成できます。 Q3:C# で DataGrid や GridView を Excel にエクスポートするには Microsoft Excel のインストールが必要ですか? A3:いいえ。Spire.XLS のようなライブラリを使用すれば、DataTable から直接 Excel ファイルを生成できるため、Excel をインストールする必要はありません。サーバー環境やクラウド環境にも適しています。