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

C# DataGridView から Excel へのエクスポート: 書式設定の完全ガイド | IronXL

C# DataGridView を書式設定付きで Excel にエクスポート: 完全ガイド: 画像 1 - C# DataGridView を書式設定付きで Excel にエクスポート

DataGridView データを Excel ファイルにエクスポートすることは、Windows Forms 開発で最も一般的なタスクの 1 つです。 売上レポート、在庫記録、顧客リストなど、表形式のデータを表示するビジネスアプリケーションを構築する場合、ユーザーはボタンをクリックするだけで、共有したりさらに分析したりできる適切な形式のExcelファイルを受け取ることを期待します。 課題は、すべてのエンドユーザーのマシンにMicrosoft Excelがインストールされていることを前提とせず、メモリリークを起こしたり、静かに動作しなくなったりするCOM相互運用クリーンアップコードに悩まされることなく、これをクリーンに実現することです。 このガイドでは、 IronXLを使用して C# で DataGridView を Excel にエクスポートする完全なプロセスを順を追って説明します。プロジェクトの設定から高度なセル書式設定まで、すべてを網羅しているので、本番環境で使用できるコードを作成できます。

今IronXLを始めましょう。
green arrow pointer

DataGridViewのエクスポート用にWindowsフォームプロジェクトを設定するにはどうすればよいですか?

従来のデータのエクスポート方法は、Microsoft Interop に依存していました。つまり、[参照の追加] を開き、[COM] タブに移動して、Microsoft Excel オブジェクト ライブラリを選択し、メモリ リークを回避するために Marshal.ReleaseComObject を呼び出す脆弱なコードを記述していました。 このパターンでは、アプリケーションが実行されるすべてのマシンに Microsoft Excel がインストールされている必要があり、大規模なデータセットでは動作が遅くなり、Office ライセンスがない展開環境では COMException エラーが発生することがよくあります。 マイクロソフト自身のオフィスオートメーションに関するガイダンスでは、サーバーサイドおよび自動化シナリオにおいて、サードパーティ製ライブラリの使用を明確に推奨している。

IronXLは、それらの依存関係をすべて取り除きます。 これは、Microsoft OfficeやCOM登録なしで、.odsファイルを読み書きする純粋な.NETライブラリです。 NuGet経由でインストールすれば、すぐにコードを書き始めることができます。

NuGet経由でIronXLをインストールする

まず、Visual Studio で.NET 10 をターゲットとする新しい Windows フォーム アプリ プロジェクトを作成します。フォーム サーフェスに DataGridView コントロールと Button を追加します。 ボタンの名前を"btnExport"とし、ラベルを"Excelにエクスポート"とします。 次に、 NuGetパッケージ マネージャー コンソールを開き、以下を実行します。

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

フォームファイルの先頭に、必要な名前空間を追加してください。

using IronXL;
using System.Data;
using IronXL;
using System.Data;
Imports IronXL
Imports System.Data
$vbLabelText   $csharpLabel

これら 2 つの名前空間は、 Excel ワークブックの読み書きに必要なすべてのIronXL型と、エクスポート パイプラインにオブジェクトを接続する標準の System.Data 型をカバーしています。

DataGridViewコントロールにサンプルデータを読み込むにはどうすればよいですか?

エクスポートロジックを構築する前に、DataGridView に代表的なデータを入力します。 Form1_Load イベントは、DataTable をデータ ソースとしてバインドするのに適した場所です。 実際のアプリケーションでは、データベースにクエリを実行したり、サービスを呼び出したりしますが、ここではハードコードされた DataTable が構造を明確に示しています。 Microsoft Docs の DataGridView コントロールの概要には、コントロールがデータソースをどのように管理するかについての詳細な情報が記載されています。

DataTableをDataGridViewにバインドする

void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ProductID", typeof(int));
    dt.Columns.Add("ProductName", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock", typeof(int));

    dt.Rows.Add(1, "Laptop", 999.99m, 50);
    dt.Rows.Add(2, "Mouse", 29.99m, 200);
    dt.Rows.Add(3, "Keyboard", 79.99m, 150);
    dt.Rows.Add(4, "Monitor", 349.99m, 75);
    dt.Rows.Add(5, "Webcam", 89.99m, 120);

    dataGridView1.DataSource = dt;
}
void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ProductID", typeof(int));
    dt.Columns.Add("ProductName", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock", typeof(int));

    dt.Rows.Add(1, "Laptop", 999.99m, 50);
    dt.Rows.Add(2, "Mouse", 29.99m, 200);
    dt.Rows.Add(3, "Keyboard", 79.99m, 150);
    dt.Rows.Add(4, "Monitor", 349.99m, 75);
    dt.Rows.Add(5, "Webcam", 89.99m, 120);

    dataGridView1.DataSource = dt;
}
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dt As New DataTable()
    dt.Columns.Add("ProductID", GetType(Integer))
    dt.Columns.Add("ProductName", GetType(String))
    dt.Columns.Add("Price", GetType(Decimal))
    dt.Columns.Add("Stock", GetType(Integer))

    dt.Rows.Add(1, "Laptop", 999.99D, 50)
    dt.Rows.Add(2, "Mouse", 29.99D, 200)
    dt.Rows.Add(3, "Keyboard", 79.99D, 150)
    dt.Rows.Add(4, "Monitor", 349.99D, 75)
    dt.Rows.Add(5, "Webcam", 89.99D, 120)

    dataGridView1.DataSource = dt
End Sub
$vbLabelText   $csharpLabel

このコードは、イベントハンドラのシグネチャにトップレベルのステートメントスタイルを使用しています。 DataTable には、整数、文字列、小数、整数の 4 つの型付き列があり、 IronXL はExcel ワークブックに書き込む際にこれらを保持します。 型付き列が重要なのは、 IronXLが数値列をテキストではなく数値セルとして書き込むため、ユーザーがExcelで値を再フォーマットすることなく並べ替えや合計を行うことができるからです。

C# DataGridView 書式設定付き Excel へのエクスポート: 完全ガイド: 画像 2 - フォームの UI

DataGridView は、DataTable 列名から列ヘッダー行を自動的にレンダリングします。 エクスポート時には、ヘッダー行をExcelファイルに保持したいので、エクスポートコードではヘッダーをデータ行とは別に処理する必要があります。次のセクションでは、まさにその点について説明します。

本番環境での使用においては、DataTable が Entity Framework、Dapper、ADO .NET、またはその他のデータアクセス層から来た場合でも、同じパターンが適用されます。 DataGridView バインディングはエクスポートコードから分離されているため、エクスポートロジックに手を加えることなくデータソースを交換できます。

DataGridViewのデータをExcelファイルにエクスポートするにはどうすればよいですか?

コアとなるエクスポート処理は、ボタンクリックハンドラー内で実行されます。 IronXL は、列とセルのマッピングを自動的に処理するメソッドを LoadFromDataTable に提供します。 最もクリーンな方法は、DataGridView から DataTable を抽出し、それを直接渡すことです。 .xlsx フォーマットの基盤となる Open XML SDK は、 Microsoft によって文書化されており、 IronXLのような純粋な.NETソリューションがプログラムによる生成において Interop よりも優れている理由を裏付けています。

ボタンクリックエクスポートハンドラー

void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable();

        foreach (DataGridViewColumn column in dataGridView1.Columns)
            dt.Columns.Add(column.HeaderText);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;

            DataRow dataRow = dt.NewRow();
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
                dataRow[i] = row.Cells[i].Value ?? DBNull.Value;

            dt.Rows.Add(dataRow);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.DefaultWorkSheet;
        worksheet.Name = "Product Data";

        worksheet.LoadFromDataTable(dt, true);

        string outputPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        );

        workbook.SaveAs(outputPath);
        MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable();

        foreach (DataGridViewColumn column in dataGridView1.Columns)
            dt.Columns.Add(column.HeaderText);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;

            DataRow dataRow = dt.NewRow();
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
                dataRow[i] = row.Cells[i].Value ?? DBNull.Value;

            dt.Rows.Add(dataRow);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.DefaultWorkSheet;
        worksheet.Name = "Product Data";

        worksheet.LoadFromDataTable(dt, true);

        string outputPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        );

        workbook.SaveAs(outputPath);
        MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
Imports System
Imports System.Data
Imports System.IO
Imports System.Windows.Forms

Public Sub btnExport_Click(sender As Object, e As EventArgs)
    Try
        Dim dt As New DataTable()

        For Each column As DataGridViewColumn In dataGridView1.Columns
            dt.Columns.Add(column.HeaderText)
        Next

        For Each row As DataGridViewRow In dataGridView1.Rows
            If row.IsNewRow Then Continue For

            Dim dataRow As DataRow = dt.NewRow()
            For i As Integer = 0 To dataGridView1.Columns.Count - 1
                dataRow(i) = If(row.Cells(i).Value, DBNull.Value)
            Next

            dt.Rows.Add(dataRow)
        Next

        Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
        worksheet.Name = "Product Data"

        worksheet.LoadFromDataTable(dt, True)

        Dim outputPath As String = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        )

        workbook.SaveAs(outputPath)
        MessageBox.Show($"Exported successfully to:{Environment.NewLine}{outputPath}", "Export Complete",
                        MessageBoxButtons.OK, MessageBoxIcon.Information)
    Catch ex As Exception
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub
$vbLabelText   $csharpLabel

C# DataGridView を書式設定付きで Excel にエクスポート: 完全ガイド: 画像 3 - 生成された Excel ファイル

LoadFromDataTable(dt, true) 呼び出しは、DataTable と、 IronXL に列名を Excel の最初の行として書き込むように指示するブール値フラグを受け取ります。これらがヘッダー セルになります。 ワークブックは、ハードコードされたパスではなく、Environment.SpecialFolder.Desktop を使用してユーザーのデスクトップに保存されるため、コードがユーザーアカウント間で移植可能になります。

null チェック (?? セルに値が含まれていない場合、DBNull.Value) prevents a NullReferenceException が発生します。 これは、オプション項目が空欄になる可能性がある実世界のデータにとって重要です。 IronXL は、文字列 "DBNull" の代わりに DBNull を空のセルとして書き込むため、出力がきれいになります。

Excel ファイルから DataGridView にデータを読み戻す方法の詳細については、 IronXL DataTable のドキュメントを参照してください。このドキュメントでは、逆の操作と、複数シートのワークブックのExcel を DataSet に変換する方法について説明しています。

エクスポートしたExcelファイルにProfessional書式設定を適用するにはどうすればよいですか?

Excelファイル内のプレーンなデータも機能的ではありますが、太字の見出し、内容に合わせた列幅、行の背景色を交互に使用するなど、プロフェッショナルな形式で出力されたデータであれば、ユーザーが信頼できるツールとなるか、エクスポート後にすぐに手作業で再フォーマットされるツールとなるかの違いが生じます。 IronXLは、フォント、色、枠線、数値形式、配置などを網羅する豊富なセルスタイル設定APIを提供しています。 スプレッドシートスタイルのOOXML仕様は、 IronXLが書き出す基本フォーマットを定義しており、準拠するアプリケーションであればどのアプリケーションでも出力が正しく開くことを保証しています。

ヘッダーのスタイルと行の交互の色を適用する

void ExportWithFormatting(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    worksheet.Name = "Formatted Export";

    string[] headers = { "ID", "Product Name", "Price", "Stock" };

    // Write and style header row
    for (int col = 0; col < headers.Length; col++)
    {
        char colLetter = (char)('A' + col);
        string cellAddress = $"{colLetter}1";

        worksheet.SetCellValue(0, col, headers[col]);
        worksheet[cellAddress].Style.Font.Bold = true;
        worksheet[cellAddress].Style.Font.Height = 12;
        worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
        worksheet[cellAddress].Style.Font.Color = "#FFFFFF";
        worksheet[cellAddress].Style.HorizontalAlignment =
            IronXl.Styles.HorizontalAlignment.Center;
    }

    // Write data rows with alternating background colors
    int rowIndex = 1;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(rowIndex, col,
                row.Cells[col].Value?.ToString() ?? string.Empty);
        }

        if (rowIndex % 2 == 0)
        {
            string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}";
            worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5");
        }

        rowIndex++;
    }

    // Format the Price column as currency
    worksheet["C2:C100"].Style.Format = "$#,##0.00";

    // Auto-fit column widths
    worksheet.AutoSizeColumn(0);
    worksheet.AutoSizeColumn(1);
    worksheet.AutoSizeColumn(2);
    worksheet.AutoSizeColumn(3);

    string outputPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "FormattedExport.xlsx"
    );

    workbook.SaveAs(outputPath);
    MessageBox.Show("Formatted export complete.", "Done",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
void ExportWithFormatting(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    worksheet.Name = "Formatted Export";

    string[] headers = { "ID", "Product Name", "Price", "Stock" };

    // Write and style header row
    for (int col = 0; col < headers.Length; col++)
    {
        char colLetter = (char)('A' + col);
        string cellAddress = $"{colLetter}1";

        worksheet.SetCellValue(0, col, headers[col]);
        worksheet[cellAddress].Style.Font.Bold = true;
        worksheet[cellAddress].Style.Font.Height = 12;
        worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
        worksheet[cellAddress].Style.Font.Color = "#FFFFFF";
        worksheet[cellAddress].Style.HorizontalAlignment =
            IronXl.Styles.HorizontalAlignment.Center;
    }

    // Write data rows with alternating background colors
    int rowIndex = 1;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(rowIndex, col,
                row.Cells[col].Value?.ToString() ?? string.Empty);
        }

        if (rowIndex % 2 == 0)
        {
            string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}";
            worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5");
        }

        rowIndex++;
    }

    // Format the Price column as currency
    worksheet["C2:C100"].Style.Format = "$#,##0.00";

    // Auto-fit column widths
    worksheet.AutoSizeColumn(0);
    worksheet.AutoSizeColumn(1);
    worksheet.AutoSizeColumn(2);
    worksheet.AutoSizeColumn(3);

    string outputPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "FormattedExport.xlsx"
    );

    workbook.SaveAs(outputPath);
    MessageBox.Show("Formatted export complete.", "Done",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports IronXL

Sub ExportWithFormatting(sender As Object, e As EventArgs)
    Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
    worksheet.Name = "Formatted Export"

    Dim headers As String() = {"ID", "Product Name", "Price", "Stock"}

    ' Write and style header row
    For col As Integer = 0 To headers.Length - 1
        Dim colLetter As Char = ChrW(AscW("A"c) + col)
        Dim cellAddress As String = $"{colLetter}1"

        worksheet.SetCellValue(0, col, headers(col))
        worksheet(cellAddress).Style.Font.Bold = True
        worksheet(cellAddress).Style.Font.Height = 12
        worksheet(cellAddress).Style.SetBackgroundColor("#4472C4")
        worksheet(cellAddress).Style.Font.Color = "#FFFFFF"
        worksheet(cellAddress).Style.HorizontalAlignment = IronXL.Styles.HorizontalAlignment.Center
    Next

    ' Write data rows with alternating background colors
    Dim rowIndex As Integer = 1
    For Each row As DataGridViewRow In dataGridView1.Rows
        If row.IsNewRow Then Continue For

        For col As Integer = 0 To dataGridView1.Columns.Count - 1
            worksheet.SetCellValue(rowIndex, col, If(row.Cells(col).Value?.ToString(), String.Empty))
        Next

        If rowIndex Mod 2 = 0 Then
            Dim rangeAddress As String = $"A{rowIndex + 1}:D{rowIndex + 1}"
            worksheet(rangeAddress).Style.SetBackgroundColor("#D6DCE5")
        End If

        rowIndex += 1
    Next

    ' Format the Price column as currency
    worksheet("C2:C100").Style.Format = "$#,##0.00"

    ' Auto-fit column widths
    worksheet.AutoSizeColumn(0)
    worksheet.AutoSizeColumn(1)
    worksheet.AutoSizeColumn(2)
    worksheet.AutoSizeColumn(3)

    Dim outputPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "FormattedExport.xlsx")

    workbook.SaveAs(outputPath)
    MessageBox.Show("Formatted export complete.", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
$vbLabelText   $csharpLabel

C# DataGridView を書式設定付き Excel にエクスポート: 完全ガイド: 画像 4 - 生成された書式設定済み Excel ファイルの出力

書式設定コードは、いくつかの手法を適用しています。 ヘッダー行は青色の背景(#4472C4)に白色のテキスト、12ポイントの太字フォント、中央揃えで表示されます。これは標準的なビジネス用スプレッドシートのスタイルです。 データ行は偶数行ごとに白と薄灰色(#D6DCE5)が交互に表示されるため、ユーザーは広い表でも自分の位置を見失うことなく読みやすくなります。 価格列は、Excelに組み込まれている通貨形式($#,##0.00)を使用しているため、基となる数値データは変更されずに、スプレッドシート上で値がドル記号と小数点以下2桁で表示されます。 AutoSizeColumn 各列を最長の値に合わせて調整し、コンテンツが切り捨てられないようにします。

このパターンは、セルの境界線のスタイル設定条件付き書式設定データ検証ルールなどによってさらに拡張できます。 企業テンプレートに合わせる必要があるレポートの場合は、ページレイアウトと印刷範囲を設定することで、エクスポートされたファイルを調整なしで印刷できる状態にすることもできます。

大規模データセットの処理とパフォーマンスチューニングはどのように行っていますか?

DataGridView が数千行にバインドされている場合、セルごとに反復処理すると著しく遅くなります。 2つの最適化により、パフォーマンスが大幅に向上しました。 まず、セルごとの呼び出し SetCellValue の代わりに LoadFromDataTable を使用してください。 第二に、データソースが DataTable の場合は、DataGridView 行から値を抽出するのではなく、それをIronXLに直接渡してください。

void ExportLargeDataset(DataTable sourceTable)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;

    // Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, true);

    // Apply header styling after load
    int colCount = sourceTable.Columns.Count;
    for (int col = 0; col < colCount; col++)
    {
        char colLetter = (char)('A' + col);
        worksheet[$"{colLetter}1"].Style.Font.Bold = true;
        worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4");
        worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF";
    }

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ));
}
void ExportLargeDataset(DataTable sourceTable)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;

    // Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, true);

    // Apply header styling after load
    int colCount = sourceTable.Columns.Count;
    for (int col = 0; col < colCount; col++)
    {
        char colLetter = (char)('A' + col);
        worksheet[$"{colLetter}1"].Style.Font.Bold = true;
        worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4");
        worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF";
    }

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ));
}
Option Strict On



Sub ExportLargeDataset(sourceTable As DataTable)
    Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim worksheet As WorkSheet = workbook.DefaultWorkSheet

    ' Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, True)

    ' Apply header styling after load
    Dim colCount As Integer = sourceTable.Columns.Count
    For col As Integer = 0 To colCount - 1
        Dim colLetter As Char = ChrW(AscW("A"c) + col)
        worksheet($"{colLetter}1").Style.Font.Bold = True
        worksheet($"{colLetter}1").Style.SetBackgroundColor("#4472C4")
        worksheet($"{colLetter}1").Style.Font.Color = "#FFFFFF"
    Next

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ))
End Sub
$vbLabelText   $csharpLabel

10,000 行を超えるデータセットの場合、エクスポートをバックグラウンド スレッドで実行することで、UI の応答性を維持できます。エクスポート ロジックを Task.Run でラップし、MessageBox.Show コールを Invoke を使用して UI スレッドにマーシャリングします。 IronXLは、別々のインスタンスでの書き込み操作に対してスレッドセーフなので、必要に応じて複数のエクスポートを同時に実行できます。

追加のパフォーマンスリソース:

DataGridViewのエクスポートに関して、 IronXLとMicrosoft Interopを比較するとどうなりますか?

多くの開発者は、Microsoft Excel Interopから開発を始めます。なぜなら、これはOfficeに同梱されており、追加のパッケージを必要としないからです。 しかし、相互運用性には、実運用環境ではすぐに顕在化する現実的なコストが伴う。 以下の表は、主な相違点をまとめたものです。

IronXLとMicrosoft ExcelのDataGridViewエクスポートにおける相互運用性の比較
能力 IronXL Microsoft Interop
Microsoft Excelがインストールされている必要があります。 なし はい
サーバー/クラウド環境で動作します はい いいえ(マイクロソフトによるサポート対象外)
COMオブジェクトのクリーンアップが必要です なし はい(Marshal.ReleaseComObject)
大規模データセットにおけるパフォーマンス 高速(純粋な.NET) 遅い(COMマーシャリングのオーバーヘッド)
インストール方法 NuGet COMリファレンス/オフィスインストール
サポートされている.NETバージョン .NET 4.6.2 -- .NET 10 .NET Frameworkのみ(制限あり)
XLSX、CSV、ODSに対応 はい Excel経由のXLSX/XLS形式のみ

マイクロソフト自身のドキュメントでも、安定性やライセンス上の懸念を理由に、サーバーやサービスアカウントでOffice Interopを使用しないよう警告している。 IronXLは、Azure App Service、Windowsサービスホスト、Dockerコンテナ、およびExcelのようなデスクトップアプリケーションの実行が現実的でないその他のヘッドレス環境において、正しく動作します。

Interop を既に利用しているチームで移行を希望する場合、IronXL の API は WorkBook および WorkSheet の操作のほとんどが直接変換されるほど十分に近いマッピングになっています。 IronXL移行ガイドでは、一般的な相互運用パターンと、それに対応するIronXLの実装について解説しています。

次のステップは何ですか?

IronXLを使用して DataGridView データを Excel にエクスポートするには、 NuGetパッケージのインストールと数行のコードだけで済み、脆弱な COM 相互運用アプローチを、あらゆる展開環境で動作するクリーンで保守性の高いソリューションに置き換えることができます。 ここで説明するテクニック(基本的なエクスポート、フォーマット済み出力、大規模データセットの最適化、比較表)を使えば、この機能をWindows Formsアプリケーションに組み込んで出荷するために必要なすべてが揃います。

ここから、関連する以下の機能をご覧ください。

プロジェクトでIronXLの全機能をテストするには、無料のトライアルを開始してください。また、本番環境への導入準備が整ったら、 IronXLのライセンスオプションをご確認ください。

よくある質問

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

NuGet経由でIronXLをインストールし、DataGridView から DataTable を抽出し、WorkBook と WorkSheet を作成し、worksheet.LoadFromDataTable(dt, true) を呼び出して、workbook.SaveAs で保存します。

DataGridViewをExcelにエクスポートする際、どのようなフォーマットオプションがありますか?

IronXL は、太字フォント、背景色、フォント色、水平配置、数値形式 (通貨など)、列の自動サイズ調整、境界線スタイル、条件付き書式をサポートしています。

DataGridView データをエクスポートするには、Microsoft Excel をインストールする必要がありますか?

いいえIronXLは、Microsoft Office やマシン上の COM 登録を必要とせずに Excel ファイルを生成する純粋な.NETライブラリです。

DataGridViewをExcelにエクスポートするときに、ヘッダーのスタイルを設定できますか?

はい。ヘッダー行を書き込んだ後、アドレスで各ヘッダーセルにアクセスし、Style.Font.Bold、Style.SetBackgroundColor、Style.Font.Colorプロパティを設定します。

DataGridViewからエクスポートする際、Excelで行の色を交互に適用するにはどうすればよいですか?

DataGridView の行を反復処理するときに行インデックスを追跡し、偶数行の場合は、選択した 16 進色で worksheet[rangeAddress].Style.SetBackgroundColor を使用して範囲スタイルを適用します。

DataGridView を Excel にエクスポートするときに、大規模なデータセットをどのように処理すればよいですか?

セルを一つずつ反復処理するのではなく、基になるDataTableをworksheet.LoadFromDataTableに直接渡してください。非常に大きなデータセットの場合は、Task.Runを使用してバックグラウンドスレッドでエクスポートを実行してください。

DataGridView エクスポートに関してIronXLと Microsoft Excel Interop を比較するとどうなりますか?

IronXL はMicrosoft Excel を必要とせず、サーバーおよびクラウド環境で動作し、COM クリーンアップ コードを必要とせず、大規模なデータセットで大幅に高速に動作します。

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

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

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

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね