フッターコンテンツにスキップ
IRONXLの使用

C# 列ヘッダー付きの DataGridView を Excel にエクスポートする

C# で列ヘッダー付きの DataGridView を Excel にエクスポートするにはどうすればよいですか?

Windows フォームの DataGridView コントロールから Excel 形式にデータをエクスポートすることは一般的な要件ですが、開発者はエクスポートされたファイルに列ヘッダーが欠落しているという困難な壁にぶつかることがよくあります。 列ヘッダー付きの DataGridView を Excel にエクスポートする必要がある場合、ソリューションではすべてのデータと書式設定を確実に保持する必要があります。 Microsoft Office Interop を使用する従来のアプローチは、遅く、不安定で、コードを実行するすべてのマシンに MS Excel をインストールする必要があります。

IronXL はこの問題をきれいに解決します。 これは、Office に依存せずに Excel ファイルの読み取り、作成、書き込みを行う.NET Excel ライブラリです。 このチュートリアルでは、列ヘッダー、データ型、null セル、およびユーザーフレンドリーなファイル保存をわずか数行のコードで処理する完全なエクスポート ソリューションについて説明します。

最後に、すべての列ヘッダーをそのままにして DataGridView を XLSX ファイルにエクスポートする、機能的な Windows フォーム ボタン ハンドラーが完成します。

始める前に必要なもの

コードを書く前に、次の点を確認してください。

  • Visual Studio 2022 以降(任意のエディション)
  • .NET 10 SDKがインストールされている
  • .NET 10 をターゲットとした Windows フォーム アプリケーション プロジェクト
  • IronXLをインストールするためのNuGetアクセス

以下の例では、トップレベルのステートメントと最新 for .NET 10 プロジェクト構造が全体的に使用されています。

.NETプロジェクトにライブラリをインストールするにはどうすればよいでしょうか?

Visual Studio でNuGetパッケージ マネージャー コンソールを開き、次のいずれかのコマンドを実行します。 このパッケージはNuGetギャラリーに掲載されており、 .NET Standard 2.0 以上を対象としているため、最新 for .NETプロジェクトで動作します。

Install-Package IronXL
Install-Package IronXL
SHELL
dotnet add package IronXL
dotnet add package IronXL
SHELL

インストール後、フォーム ファイルの先頭に必要な名前空間を追加します。

using IronXL;
using System;
using System.Data;
using System.Windows.Forms;
using IronXL;
using System;
using System.Data;
using System.Windows.Forms;
$vbLabelText   $csharpLabel

これらのインポートにより、IronXL の Excel 機能、DataTable 操作、およびエクスポート プロセスに必要な Windows フォーム コントロールにアクセスできるようになります。

サンプル データを使用して DataGridView を設定するにはどうすればよいですか?

まず、Visual Studio で Windows フォーム アプリケーションを作成します。 デザイナーを使用して、dataGridView1 という名前の DataGridView と btnExport という名前の Button をメイン フォームに追加します。 次に、フォームの読み込み時にグリッドに入力します。

using System;
using System.Data;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();

        // Define columns -- these names become Excel headers
        dt.Columns.Add("Product ID", typeof(int));
        dt.Columns.Add("Product Name", typeof(string));
        dt.Columns.Add("Price", typeof(decimal));
        dt.Columns.Add("Stock Quantity", typeof(int));

        // Add sample rows
        dt.Rows.Add(1001, "Laptop", 999.99m, 15);
        dt.Rows.Add(1002, "Mouse", 29.99m, 50);
        dt.Rows.Add(1003, "Keyboard", 79.99m, 30);
        dt.Rows.Add(1004, "Monitor", 299.99m, 12);
        dt.Rows.Add(1005, "Headphones", 89.99m, 25);

        // Bind data to the grid
        dataGridView1.DataSource = dt;
    }
}
using System;
using System.Data;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();

        // Define columns -- these names become Excel headers
        dt.Columns.Add("Product ID", typeof(int));
        dt.Columns.Add("Product Name", typeof(string));
        dt.Columns.Add("Price", typeof(decimal));
        dt.Columns.Add("Stock Quantity", typeof(int));

        // Add sample rows
        dt.Rows.Add(1001, "Laptop", 999.99m, 15);
        dt.Rows.Add(1002, "Mouse", 29.99m, 50);
        dt.Rows.Add(1003, "Keyboard", 79.99m, 30);
        dt.Rows.Add(1004, "Monitor", 299.99m, 12);
        dt.Rows.Add(1005, "Headphones", 89.99m, 25);

        // Bind data to the grid
        dataGridView1.DataSource = dt;
    }
}
$vbLabelText   $csharpLabel

dt.Columns.Add(...) 呼び出しで定義された列名は、エクスポートされた Excel ファイルのヘッダー行になります。ここでは任意のデータソースを使用できます。データベースクエリの結果、CSV インポート、または DataTable として保存された API レスポンスなど、いずれも後述のエクスポートコードと同様に機能します。 DataTable アプローチは、DataGridView が任意の IList または IBindingList を受け入れる DataSource プロパティを公開するため、特に便利です。つまり、同じエクスポート コードを変更せずにすべてのバインディング シナリオに一般化できます。

DataGridView が SqlDataAdapter を使用してデータベースから設定されている場合、DataTable には既に型指定された列が含まれています。 これらの入力された値に対して ToString() を呼び出すのではなく SetCellValue に渡すと、Excel 出力で数値列が数値のまま保持されます。これは、下流のレポートやピボット テーブルの使用に重要になります。

これにより、すべてのデータが入力された DataGridView が作成されます。

C# IronXLを使用して列ヘッダー付きの DataGridView を Excel にエクスポートする: 画像 1 - DataGridView 内のサンプル データ

より高度なデータ バインディング シナリオについては、Microsoft のDataGridView データ バインディングに関するドキュメントに追加の例が提供されています。

列ヘッダーを保持したまま DataGridView を Excel にエクスポートするにはどうすればよいですか?

エクスポート メソッドは、各 DataGridView 列の HeaderText プロパティから列ヘッダーを読み取り、ワークシートの行 0 に書き込みます。 データ行は 1 行目以降に続きます。 このメソッドを btnExport クリック イベントに接続します。

private void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        // Create a new Excel workbook in XLSX format
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Exported Data");

        // Write column headers to row 0
        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(0, col, dataGridView1.Columns[col].HeaderText);
        }

        // Write data rows starting at row 1
        for (int row = 0; row < dataGridView1.Rows.Count; row++)
        {
            // Skip the placeholder new-row at the bottom of the grid
            if (dataGridView1.AllowUserToAddRows && row == dataGridView1.Rows.Count - 1)
                continue;

            for (int col = 0; col < dataGridView1.Columns.Count; col++)
            {
                var cellValue = dataGridView1.Rows[row].Cells[col].Value;
                if (cellValue != null)
                {
                    worksheet.SetCellValue(row + 1, col, cellValue.ToString());
                }
            }
        }

        // Prompt the user to choose a save location
        using SaveFileDialog saveFileDialog = new SaveFileDialog
        {
            Filter = "Excel Files|*.xlsx",
            FileName = "DataGridView_Export.xlsx"
        };

        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            workbook.SaveAs(saveFileDialog.FileName);
            MessageBox.Show("Export completed successfully!", "Success",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
                       MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
private void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        // Create a new Excel workbook in XLSX format
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Exported Data");

        // Write column headers to row 0
        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(0, col, dataGridView1.Columns[col].HeaderText);
        }

        // Write data rows starting at row 1
        for (int row = 0; row < dataGridView1.Rows.Count; row++)
        {
            // Skip the placeholder new-row at the bottom of the grid
            if (dataGridView1.AllowUserToAddRows && row == dataGridView1.Rows.Count - 1)
                continue;

            for (int col = 0; col < dataGridView1.Columns.Count; col++)
            {
                var cellValue = dataGridView1.Rows[row].Cells[col].Value;
                if (cellValue != null)
                {
                    worksheet.SetCellValue(row + 1, col, cellValue.ToString());
                }
            }
        }

        // Prompt the user to choose a save location
        using SaveFileDialog saveFileDialog = new SaveFileDialog
        {
            Filter = "Excel Files|*.xlsx",
            FileName = "DataGridView_Export.xlsx"
        };

        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            workbook.SaveAs(saveFileDialog.FileName);
            MessageBox.Show("Export completed successfully!", "Success",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
                       MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
$vbLabelText   $csharpLabel

エクスポート手順の詳細

この方法の各ステップには特定の目的があります。

  • WorkBook.Create : XLSX 形式を使用してメモリ内に新しい Excel ファイルを初期化します。 SaveAs が呼び出されるまで、ファイルはディスクに書き込まれません。
  • CreateWorkSheet : エクスポートされたデータを保持するための名前付きシートを追加します。 Excel のタブ ラベルとして"エクスポートされたデータ"という名前が表示されます。 -列ヘッダー ループ: 各列の dataGridView1.Columns[col].HeaderText を読み取り、行インデックス 0 に書き込みます。これは、ヘッダーを保持するための重要なステップです。 -データ行ループ: ネストされたループは、Excel の行インデックスとして row + 1 を使用してすべての行と列を反復処理し、データが常にヘッダー行の下から始まるようにします。
  • Null チェック: 実際のデータではよくあることですが、セルに値が含まれていない場合に例外が発生するのを防ぎます。
  • SaveFileDialog : パスをハードコーディングするのではなく、実行時にユーザーがファイル名と保存先を選択できるようにします。

エクスポートされたファイルは次のようになります。

C# IronXLを使用して列ヘッダー付きの DataGridView を Excel にエクスポートする: 画像 2 - エクスポートされたサンプル データを含む出力 Excel ファイル

エクスポート中に一般的なエッジケースをどのように処理しますか?

現実世界のデータは、サンプル データセットほどきれいに見えることはほとんどありません。 ここでは、最も遭遇する可能性の高いシナリオとその対処方法を説明します。

空のセル

データ ループ内の null チェック (if (cellValue != null)) は、例外をスローせずに空のセルを処理します。 空のセルは Excel 出力では空白のままとなり、グリッド構造が保持されます。

混合データ型

IronXL はさまざまなデータ形式を自動的に処理します。 ToString() を介して数値を文字列として渡すと、値によっては Excel がそれを数値として認識する場合があります。 正確な型制御を行うには、書き込む前にセルの値を正しい型にキャストします。

if (cellValue is int intVal)
    worksheet.SetCellValue(row + 1, col, intVal);
else if (cellValue is decimal decVal)
    worksheet.SetCellValue(row + 1, col, (double)decVal);
else
    worksheet.SetCellValue(row + 1, col, cellValue?.ToString() ?? string.Empty);
if (cellValue is int intVal)
    worksheet.SetCellValue(row + 1, col, intVal);
else if (cellValue is decimal decVal)
    worksheet.SetCellValue(row + 1, col, (double)decVal);
else
    worksheet.SetCellValue(row + 1, col, cellValue?.ToString() ?? string.Empty);
$vbLabelText   $csharpLabel

このアプローチにより、Excel 内の数値列が数値として保持されるため、数式と並べ替えが下流で正しく機能します。

ヘッダー内の特殊文字

> などの特殊文字やアクセント付き文字を含む列ヘッダーは正しくエクスポートされます。 IronXL はエンコードを自動的に処理するため、ユーザー側でエスケープする必要はありません。

大規模データセット

数万行のグリッドの場合、UIの応答性を維持するために、エクスポートロジックをバックグラウンドスレッドに移動することを検討してください。WorkBook.Create とループロジックを Task.Run 呼び出しでラップし、完了したコールバックからUIを更新します。 Task を使用した非同期プログラミングに関する Microsoft のドキュメントでは、パターンの詳細が説明されています。

セルのスタイル設定数式の保存、パスワード保護などの追加のシナリオについては、 IronXL のドキュメントでそれぞれ詳細に説明されています。

主な輸出アプローチを比較するとどうなりますか?

ライブラリにコミットする前に、最も一般的な方法間のトレードオフを理解しておくと役立ちます。

C# での DataGridView と Excel のエクスポート方法の比較
方法 オフィス必須 列ヘッダー パフォーマンス サーバーセーフ
Microsoft Office Interop はい マニュアル 遅い なし
OpenXML SDK なし マニュアル 速い はい
ClosedXML なし マニュアル 良い はい
IronXL なし 自動翻訳 速い はい

相互運用性ベースのソリューションでは、サーバーに Excel がインストールされている必要がありますが、これはライセンスの問題であり、展開も複雑になります。 OpenXML SDK は強力ですが低レベルです。ヘッダー行を書き込むには、XML 構造を手動で構築する必要があります。 IronXLと ClosedXML はどちらもより高レベルの API を提供していますが、IronXL のWorkBook および WorkSheet モデルは、開発者がすでにスプレッドシートについて考えている方法に密接に対応しています。

XLSX ではなく CSV にエクスポートするにはどうすればよいですか?

Excel ブックではなくCSV ファイルが必要な場合も、同じエクスポート パターンが適用されます。 ファイル形式と拡張子を変更します。

WorkBook csvWorkbook = WorkBook.Create(ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkbook.CreateWorkSheet("Data");

// Headers and data loops remain identical

using SaveFileDialog dialog = new SaveFileDialog
{
    Filter = "CSV Files|*.csv",
    FileName = "DataGridView_Export.csv"
};

if (dialog.ShowDialog() == DialogResult.OK)
    csvWorkbook.SaveAs(dialog.FileName);
WorkBook csvWorkbook = WorkBook.Create(ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkbook.CreateWorkSheet("Data");

// Headers and data loops remain identical

using SaveFileDialog dialog = new SaveFileDialog
{
    Filter = "CSV Files|*.csv",
    FileName = "DataGridView_Export.csv"
};

if (dialog.ShowDialog() == DialogResult.OK)
    csvWorkbook.SaveAs(dialog.FileName);
$vbLabelText   $csharpLabel

CSV エクスポートは、消費システムが XLSX をサポートしていない場合や、データセットが非常に大きいためファイル サイズが問題になる場合に役立ちます。

エクスポートしたファイルのヘッダー行のスタイルをどのように設定しますか?

ヘッダー行が視覚的に区別されている場合、エクスポートされたデータは読みやすくなります。 IronXL には、ヘッダー値を書き込んだ後に太字のテキスト、背景色、フォント サイズを適用できるセル スタイル設定オプションが用意されています。

// Write headers and apply bold styling
for (int col = 0; col < dataGridView1.Columns.Count; col++)
{
    string cellAddress = worksheet.GetCellAddress(0, col);
    worksheet[cellAddress].Value = dataGridView1.Columns[col].HeaderText;
    worksheet[cellAddress].Style.Font.Bold = true;
    worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
    worksheet[cellAddress].Style.Font.FontColor = "#FFFFFF";
}
// Write headers and apply bold styling
for (int col = 0; col < dataGridView1.Columns.Count; col++)
{
    string cellAddress = worksheet.GetCellAddress(0, col);
    worksheet[cellAddress].Value = dataGridView1.Columns[col].HeaderText;
    worksheet[cellAddress].Style.Font.Bold = true;
    worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
    worksheet[cellAddress].Style.Font.FontColor = "#FFFFFF";
}
$vbLabelText   $csharpLabel

スタイル設定されたヘッダー行により、受信者が手動で書式設定を適用する必要がなく、エクスポートされたファイルをすぐにレポートに使用できるようになります。 スタイル プロパティの完全なリストについては、 IronXLセル スタイル リファレンスを参照してください。

無料トライアルを始めるにはどうすればいいですか?

IronXL、この記事で紹介したエクスポート ワークフローを含むすべての機能をテストできる無料トライアルを提供しています。 上記のいずれかのNuGetコマンドを使用してパッケージをインストールし、 IronXLライセンス ページで試用キーを生成して、最初のライブラリ呼び出しの前にアプリケーションに設定します。

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
$vbLabelText   $csharpLabel

試用版では、完全に機能する Excel ファイルが生成され、利用できる機能が制限されることはありません。 実稼働展開の場合、ライセンス オプションには、単一の開発者、チーム、ロイヤリティフリーの再配布が含まれます。

関連するエクスポート シナリオについては、 IronXL がDataTables を Excel に直接エクスポートしExcel ファイルを DataGridViews に読み込みエクスポートされたデータからグラフを作成する方法について説明します。

ユースケースに適したエクスポート戦略の選択

このチュートリアル全体で示されている簡単なセル単位のエクスポート方法は、ほとんどの Windows フォーム アプリケーションに適しています。 DataGridView が DataTable にバインドされている場合は、ヘッダー行を自動的に処理する IronXL のDataTable からワークシートへのコンバーターに DataTable を直接渡すこともできます。 列レイアウトが固定されており、可能な限り短いコード パスが必要な場合は、直接 DataTable アプローチを選択します。 セルごとに条件付きロジックが必要な場合は、手動のセルごとのアプローチを選択します。たとえば、値が許容範囲外のセルを強調表示したり、書き込み前に null 許容型を明示的にマッピングしたりします。

ダウンロード可能な Excel レポートを生成するASP.NET Coreコントローラーなどのサーバー側シナリオでは、同じIronXL API が適用されます。 唯一の違いは保存先です。SaveAs(filePath) の代わりに、workbook.ToByteArray() を呼び出し、コンテンツ タイプが application/vnd.openxmlformats-officedocument.spreadsheetml.sheet のバイトを HTTP 応答に書き込みます。 列ヘッダーは、出力がファイルに送信されるかストリームに送信されるかに関係なく、同じように転送されます。

よくある質問

DataGridViewデータをC#でExcelにエクスポートするにはどうしたらいいですか?

IronXLライブラリを使用してExcelワークブックを作成し、DataGridView列を反復処理して行0にヘッダーを書き込み、次にデータ行を反復処理して行1以降のセルの値を書き込みます。SaveAsでワークブックを保存します。

データのエクスポートにIronXLを使用するメリットは何ですか?

IronXLは、Microsoft Officeのインストールを必要としないExcel操作用の高レベルAPIを提供します。手動でXMLを操作することなく、ヘッダー、データ型、ファイル形式を処理できます。

DataGridViewからExcelにエクスポートする際、列のヘッダーを保持することは可能ですか?

はい。データ行を書き込む前に、各 DataGridView 列の HeaderText プロパティを読み取り、 IronXLワークシートの行 0 に書き込みます。

IronXl.Excelエクスポートを使い始めるにはトライアルが必要ですか?

すべての機能にアクセスできる無料トライアルをご利用いただけます。NuGetパッケージをインストールし、トライアルキーを生成し、ライブラリ呼び出しを行う前にIronXl.License.LicenseKeyを設定してください。

IronXLはExcelにエクスポートする際に、大きなDataGridViewデータセットを扱うことができますか?

はい。非常に大きなグリッドの場合は、Task.Run を使用してバックグラウンドスレッドでエクスポートを実行し、 IronXL がデータを書き込む間も UI の応答性を維持します。

IronXLを使ってDataGridViewをExcelにエクスポートする手順を教えてください。

IronXLをインストールし、WorkBook と WorkSheet を作成し、DataGridView 列をループして行 0 にヘッダーを書き込み、行をループして行 1 からデータを書き込み、最後に SaveAs を呼び出してファイルを書き込みます。

なぜ他のExcelエクスポートライブラリではなくIronXLを選ぶのですか?

IronXL はOffice のインストールを必要とせず、サーバー上で実行され、強力なドキュメントとアクティブなサポートを備え、開発者のスプレッドシートに対する考え方に自然にマッピングされるクリーンな WorkBook/WorkSheet API を提供します。

IronXLのトラブルシューティングのサポートはありますか?

はい。IronXLは、ライセンスを取得したお客様に詳細な API ドキュメント、コード例、直接的なエンジニアリング サポートを提供します。

IronXLでExcelエクスポートプロセスをカスタマイズできますか?

はい。データを書き込んだ後、IronXL のスタイル API を使用して、任意のセル範囲に太字フォント、背景色、境界線、数値書式を適用できます。

IronXLはExcel以外のフォーマットへのエクスポートをサポートしていますか?

はい。IronXLはXLSX、XLS、CSV、TSV形式をサポートしています。形式の切り替えは、WorkBook.Createに渡されるExcelFileFormat列挙値を変更するだけで済みます。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me