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

C# で GridView を書式付きで Excel にエクスポートする方法

GridViewのデータをExcelにエクスポートする際に、色、フォント、行の背景色、境界線などを保持する必要があることは、ほぼすべてのデータ駆動型ASP.NETまたはWindows Formsアプリケーションで求められる要件です。 従来の方法(HtmlTextWriterStringWriter を使用してコントロールを HTML としてレンダリングする)では、Excel で書式に関する警告が表示されるファイルが生成され、ユーザーにはエラーが通知されません。 IronXLは、Microsoft Officeに依存せず、C#で完全にネイティブなXLSXファイルを生成することでこの問題を解決し、すべてのセルスタイルを正確に制御できるようにします。

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

エクスポートコードを記述する前に、 NuGetからIronXLをインストールしてください。 パッケージマネージャーコンソールを開いて次を実行します:

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

IronXLは、.NET 8、 .NET 9、 .NET 10に加え、 .NET Framework 4.6.2以降をサポートしています。 インストール後、Excel操作を実行するすべてのファイルに、次のusingディレクティブを追加してください。

using IronXL;
using IronXl.Styles;
using IronXL;
using IronXl.Styles;
Imports IronXL
Imports IronXl.Styles
$vbLabelText   $csharpLabel

追加のランタイムやOfficeとの相互運用機能は必要ありません。 このライブラリは、Microsoft Excel、LibreOffice Calc、およびGoogle Sheetsで問題なく開くことができるネイティブのXLSXバイナリファイルを作成します。

WindowsフォームのDataGridViewをセル書式設定付きでExcelにエクスポートするにはどうすればよいですか?

Windows Forms アプリケーションは、Web ベースの GridView コントロールではなく、DataGridView コントロールを使用します。 どちらの場合もエクスポートのパターンは同じです。行とセルから値を抽出し、IronXL ワークブックを作成し、スタイルを適用してから、結果を保存またはストリーミングします。

最も確実な方法は、コントロールのプロパティを型にキャストして、フィルタリングやページングが行われている可能性のあるビジュアル行の反復処理を回避することです。

using IronXL;
using IronXl.Styles;
using System;
using System.Data;
using System.IO;
using System.Windows.Forms;

DataTable dt = (DataTable)dataGridView1.DataSource;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.DefaultWorkSheet;

// Header row -- bold, blue background, white text
for (int col = 0; col < dt.Columns.Count; col++)
{
    sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    var cell = sheet.GetCellAt(0, col);
    cell.Style.Font.Bold = true;
    cell.Style.SetBackgroundColor("#4472C4");
    cell.Style.Font.Color = "#FFFFFF";
    cell.Style.BottomBorder.Type = BorderType.Thin;
}

// Data rows -- alternating row color
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        string value = dt.Rows[row][col]?.ToString() ?? string.Empty;
        sheet.SetCellValue(row + 1, col, value);

        var cell = sheet.GetCellAt(row + 1, col);
        cell.Style.SetBackgroundColor(row % 2 == 0 ? "#D6DCE5" : "#FFFFFF");
        cell.Style.BottomBorder.Type = BorderType.Thin;
    }
}

// Save via dialog
using var saveDialog = new SaveFileDialog
{
    Filter = "Excel Files|*.xlsx",
    FileName = "GridViewExport.xlsx"
};

if (saveDialog.ShowDialog() == DialogResult.OK)
{
    workBook.SaveAs(saveDialog.FileName);
    MessageBox.Show("Export successful.", "Export",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
using IronXL;
using IronXl.Styles;
using System;
using System.Data;
using System.IO;
using System.Windows.Forms;

DataTable dt = (DataTable)dataGridView1.DataSource;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.DefaultWorkSheet;

// Header row -- bold, blue background, white text
for (int col = 0; col < dt.Columns.Count; col++)
{
    sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    var cell = sheet.GetCellAt(0, col);
    cell.Style.Font.Bold = true;
    cell.Style.SetBackgroundColor("#4472C4");
    cell.Style.Font.Color = "#FFFFFF";
    cell.Style.BottomBorder.Type = BorderType.Thin;
}

// Data rows -- alternating row color
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        string value = dt.Rows[row][col]?.ToString() ?? string.Empty;
        sheet.SetCellValue(row + 1, col, value);

        var cell = sheet.GetCellAt(row + 1, col);
        cell.Style.SetBackgroundColor(row % 2 == 0 ? "#D6DCE5" : "#FFFFFF");
        cell.Style.BottomBorder.Type = BorderType.Thin;
    }
}

// Save via dialog
using var saveDialog = new SaveFileDialog
{
    Filter = "Excel Files|*.xlsx",
    FileName = "GridViewExport.xlsx"
};

if (saveDialog.ShowDialog() == DialogResult.OK)
{
    workBook.SaveAs(saveDialog.FileName);
    MessageBox.Show("Export successful.", "Export",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Imports IronXL
Imports IronXl.Styles
Imports System
Imports System.Data
Imports System.IO
Imports System.Windows.Forms

Dim dt As DataTable = DirectCast(dataGridView1.DataSource, DataTable)

Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workBook.DefaultWorkSheet

' Header row -- bold, blue background, white text
For col As Integer = 0 To dt.Columns.Count - 1
    sheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
    Dim cell = sheet.GetCellAt(0, col)
    cell.Style.Font.Bold = True
    cell.Style.SetBackgroundColor("#4472C4")
    cell.Style.Font.Color = "#FFFFFF"
    cell.Style.BottomBorder.Type = BorderType.Thin
Next

' Data rows -- alternating row color
For row As Integer = 0 To dt.Rows.Count - 1
    For col As Integer = 0 To dt.Columns.Count - 1
        Dim value As String = If(dt.Rows(row)(col)?.ToString(), String.Empty)
        sheet.SetCellValue(row + 1, col, value)

        Dim cell = sheet.GetCellAt(row + 1, col)
        cell.Style.SetBackgroundColor(If(row Mod 2 = 0, "#D6DCE5", "#FFFFFF"))
        cell.Style.BottomBorder.Type = BorderType.Thin
    Next
Next

' Save via dialog
Using saveDialog As New SaveFileDialog With {
    .Filter = "Excel Files|*.xlsx",
    .FileName = "GridViewExport.xlsx"
}
    If saveDialog.ShowDialog() = DialogResult.OK Then
        workBook.SaveAs(saveDialog.FileName)
        MessageBox.Show("Export successful.", "Export", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End If
End Using
$vbLabelText   $csharpLabel

WorkBook.Create は、XLSX 形式で新しいメモリ内ワークブックを初期化します。 DefaultWorkSheet は最初のシートを返します。保存する前に、その Name プロパティを使用して名前を変更できます。 SetCellValue は文字列、整数、倍精度浮動小数点数、および DateTime 値を受け入れます -- IronXL は正しいセルタイプを自動的に選択します。

交互に変化する行の色パターン(row % 2 == 0#D6DCE5 を選択し、それ以外の場合は #FFFFFF を選択)は、Excel に組み込まれている縞模様の行のテーブル スタイルを反映しています。 アプリケーションのデザインシステムに合致する、任意の6文字の16進数カラーコードで置き換えることができます。

出力画像

 IronXLを使用して書式設定付き GridView を Excel にエクスポートする C# : 画像 1 - GridView 出力

 IronXLを使用して書式設定付き GridView を Excel にエクスポートする C# : 画像 2 - Excel 出力

 IronXLを使用して書式設定付き GridView を Excel にエクスポートする C# : 画像 3 - メッセージ出力

ASP.NET GridViewをExcelにエクスポートして、そのファイルをブラウザにストリーミングするにはどうすればよいですか?

Webアプリケーションには、異なる配信メカニズムが必要です。 ファイルシステムに書き込む代わりに、ワークブックを MemoryStream にシリアル化し、正しいヘッダーとともに HTTP レスポンスに書き込むことで、ブラウザがそれをファイルダウンロードとして扱います。

ページ分割された GridView の重要な事前手順: エクスポートする前にページングを無効にし (AllowPaging = false)、データ ソースを再バインドして、現在のページだけでなくすべてのレコードが取得されるようにします。

using IronXL;
using IronXl.Styles;
using System;
using System.Data;
using System.IO;
using System.Web.UI;

// Disable paging so all rows are captured
GridView1.AllowPaging = false;
GridView1.DataBind();

DataTable dt = (DataTable)GridView1.DataSource;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.DefaultWorkSheet;

// Header row
for (int col = 0; col < dt.Columns.Count; col++)
{
    sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    var cell = sheet.GetCellAt(0, col);
    cell.Style.Font.Bold = true;
    cell.Style.SetBackgroundColor("#2E75B6");
    cell.Style.Font.Color = "#FFFFFF";
    cell.Style.HorizontalAlignment = HorizontalAlignment.Center;
    cell.Style.BottomBorder.Type = BorderType.Medium;
}

// Data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        sheet.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);
        var cell = sheet.GetCellAt(row + 1, col);
        cell.Style.SetBackgroundColor(row % 2 == 0 ? "#DEEAF1" : "#FFFFFF");
        cell.Style.BottomBorder.Type = BorderType.Thin;
        cell.Style.LeftBorder.Type = BorderType.Thin;
        cell.Style.RightBorder.Type = BorderType.Thin;
    }
}

// Stream to browser
byte[] fileBytes = workBook.ToByteArray();
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment; filename=GridViewExport.xlsx");
Response.BinaryWrite(fileBytes);
Response.End();
using IronXL;
using IronXl.Styles;
using System;
using System.Data;
using System.IO;
using System.Web.UI;

// Disable paging so all rows are captured
GridView1.AllowPaging = false;
GridView1.DataBind();

DataTable dt = (DataTable)GridView1.DataSource;

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workBook.DefaultWorkSheet;

// Header row
for (int col = 0; col < dt.Columns.Count; col++)
{
    sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    var cell = sheet.GetCellAt(0, col);
    cell.Style.Font.Bold = true;
    cell.Style.SetBackgroundColor("#2E75B6");
    cell.Style.Font.Color = "#FFFFFF";
    cell.Style.HorizontalAlignment = HorizontalAlignment.Center;
    cell.Style.BottomBorder.Type = BorderType.Medium;
}

// Data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        sheet.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);
        var cell = sheet.GetCellAt(row + 1, col);
        cell.Style.SetBackgroundColor(row % 2 == 0 ? "#DEEAF1" : "#FFFFFF");
        cell.Style.BottomBorder.Type = BorderType.Thin;
        cell.Style.LeftBorder.Type = BorderType.Thin;
        cell.Style.RightBorder.Type = BorderType.Thin;
    }
}

// Stream to browser
byte[] fileBytes = workBook.ToByteArray();
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment; filename=GridViewExport.xlsx");
Response.BinaryWrite(fileBytes);
Response.End();
Imports IronXL
Imports IronXl.Styles
Imports System
Imports System.Data
Imports System.IO
Imports System.Web.UI

' Disable paging so all rows are captured
GridView1.AllowPaging = False
GridView1.DataBind()

Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable)

Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workBook.DefaultWorkSheet

' Header row
For col As Integer = 0 To dt.Columns.Count - 1
    sheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
    Dim cell = sheet.GetCellAt(0, col)
    cell.Style.Font.Bold = True
    cell.Style.SetBackgroundColor("#2E75B6")
    cell.Style.Font.Color = "#FFFFFF"
    cell.Style.HorizontalAlignment = HorizontalAlignment.Center
    cell.Style.BottomBorder.Type = BorderType.Medium
Next

' Data rows
For row As Integer = 0 To dt.Rows.Count - 1
    For col As Integer = 0 To dt.Columns.Count - 1
        sheet.SetCellValue(row + 1, col, If(dt.Rows(row)(col)?.ToString(), String.Empty))
        Dim cell = sheet.GetCellAt(row + 1, col)
        cell.Style.SetBackgroundColor(If(row Mod 2 = 0, "#DEEAF1", "#FFFFFF"))
        cell.Style.BottomBorder.Type = BorderType.Thin
        cell.Style.LeftBorder.Type = BorderType.Thin
        cell.Style.RightBorder.Type = BorderType.Thin
    Next
Next

' Stream to browser
Dim fileBytes As Byte() = workBook.ToByteArray()
Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("content-disposition", "attachment; filename=GridViewExport.xlsx")
Response.BinaryWrite(fileBytes)
Response.End()
$vbLabelText   $csharpLabel

Response.AddHeadercontent-disposition: attachment を組み合わせると、すべての最新のブラウザでファイルダウンロードダイアログが強制的に表示されます。 MIMEタイプapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetはXLSXファイル用に登録されたタイプであり、ブラウザがバイナリコンテンツをインラインで表示しようとするのを防ぎます。

ASP.NET Coreアプリケーションの場合、コントローラー アクション内の Response.BinaryWriteFile(fileBytes, contentType, fileName) に置き換えてください。ワークブックの作成ロジックは同じです。

セル値に基づいて条件付き書式を適用するにはどうすればよいですか?

条件付き書式設定は、特定の条件を満たすセルを強調表示します。たとえば、期限を過ぎた日付を赤色で表示したり、しきい値を下回る値をオレンジ色で表示したりできます。 IronXLは、ワークブック作成時にセルレベルで条件付き書式を適用します。

// Assume "DueDate" is column index 3 and "Amount" is column index 4
DateTime today = DateTime.Today;

for (int row = 0; row < dt.Rows.Count; row++)
{
    // Highlight past-due dates
    if (dt.Columns.Contains("DueDate") && dt.Rows[row]["DueDate"] != DBNull.Value)
    {
        DateTime dueDate = Convert.ToDateTime(dt.Rows[row]["DueDate"]);
        var dueDateCell = sheet.GetCellAt(row + 1, 3);
        if (dueDate < today)
        {
            dueDateCell.Style.SetBackgroundColor("#FF0000");
            dueDateCell.Style.Font.Color = "#FFFFFF";
            dueDateCell.Style.Font.Bold = true;
        }
    }

    // Highlight amounts below threshold
    if (dt.Columns.Contains("Amount") && dt.Rows[row]["Amount"] != DBNull.Value)
    {
        decimal amount = Convert.ToDecimal(dt.Rows[row]["Amount"]);
        var amountCell = sheet.GetCellAt(row + 1, 4);
        if (amount < 100m)
        {
            amountCell.Style.SetBackgroundColor("#FFC000");
        }
    }
}
// Assume "DueDate" is column index 3 and "Amount" is column index 4
DateTime today = DateTime.Today;

for (int row = 0; row < dt.Rows.Count; row++)
{
    // Highlight past-due dates
    if (dt.Columns.Contains("DueDate") && dt.Rows[row]["DueDate"] != DBNull.Value)
    {
        DateTime dueDate = Convert.ToDateTime(dt.Rows[row]["DueDate"]);
        var dueDateCell = sheet.GetCellAt(row + 1, 3);
        if (dueDate < today)
        {
            dueDateCell.Style.SetBackgroundColor("#FF0000");
            dueDateCell.Style.Font.Color = "#FFFFFF";
            dueDateCell.Style.Font.Bold = true;
        }
    }

    // Highlight amounts below threshold
    if (dt.Columns.Contains("Amount") && dt.Rows[row]["Amount"] != DBNull.Value)
    {
        decimal amount = Convert.ToDecimal(dt.Rows[row]["Amount"]);
        var amountCell = sheet.GetCellAt(row + 1, 4);
        if (amount < 100m)
        {
            amountCell.Style.SetBackgroundColor("#FFC000");
        }
    }
}
Imports System

' Assume "DueDate" is column index 3 and "Amount" is column index 4
Dim today As DateTime = DateTime.Today

For row As Integer = 0 To dt.Rows.Count - 1
    ' Highlight past-due dates
    If dt.Columns.Contains("DueDate") AndAlso dt.Rows(row)("DueDate") IsNot DBNull.Value Then
        Dim dueDate As DateTime = Convert.ToDateTime(dt.Rows(row)("DueDate"))
        Dim dueDateCell = sheet.GetCellAt(row + 1, 3)
        If dueDate < today Then
            dueDateCell.Style.SetBackgroundColor("#FF0000")
            dueDateCell.Style.Font.Color = "#FFFFFF"
            dueDateCell.Style.Font.Bold = True
        End If
    End If

    ' Highlight amounts below threshold
    If dt.Columns.Contains("Amount") AndAlso dt.Rows(row)("Amount") IsNot DBNull.Value Then
        Dim amount As Decimal = Convert.ToDecimal(dt.Rows(row)("Amount"))
        Dim amountCell = sheet.GetCellAt(row + 1, 4)
        If amount < 100D Then
            amountCell.Style.SetBackgroundColor("#FFC000")
        End If
    End If
Next row
$vbLabelText   $csharpLabel

このパターンは組み合わせ可能です。レポート作成要件に応じて、条件チェックをいくつでも追加できます。 IronXLはセル単位で動作するため、基本行スタイルの後に条件付きスタイルを適用することで、条件付き書式と交互行色ロジックを組み合わせることができます。

列幅を設定してヘッダー行を固定するにはどうすればよいですか?

プロフェッショナルな形式でエクスポートされたExcelファイルには、適切な列幅と固定されたヘッダー行が含まれているため、ユーザーが大規模なデータセットをスクロールしても列名が常に表示されます。

IronXL は、WorkSheet 列アクセサを介して列幅を公開し、FreezeRows メソッドを介してヘッダーを固定します。

// Auto-size columns 0 through the last column index
for (int col = 0; col < dt.Columns.Count; col++)
{
    // Set column width in character units (1 unit ≈ one default character width)
    sheet.SetColumnWidth(col, 20);
}

// Freeze the first row (index 0) so the header stays visible while scrolling
sheet.FreezeRows(1);

// Optionally set row height for the header (in points)
sheet.SetRowHeight(0, 20);
// Auto-size columns 0 through the last column index
for (int col = 0; col < dt.Columns.Count; col++)
{
    // Set column width in character units (1 unit ≈ one default character width)
    sheet.SetColumnWidth(col, 20);
}

// Freeze the first row (index 0) so the header stays visible while scrolling
sheet.FreezeRows(1);

// Optionally set row height for the header (in points)
sheet.SetRowHeight(0, 20);
' Auto-size columns 0 through the last column index
For col As Integer = 0 To dt.Columns.Count - 1
    ' Set column width in character units (1 unit ≈ one default character width)
    sheet.SetColumnWidth(col, 20)
Next

' Freeze the first row (index 0) so the header stays visible while scrolling
sheet.FreezeRows(1)

' Optionally set row height for the header (in points)
sheet.SetRowHeight(0, 20)
$vbLabelText   $csharpLabel

実運用においては、固定値を使用するのではなく、各列の最大文字数に基づいて幅を計算することを検討してください。 DataTable 列の値を繰り返し処理し、文字列の長さを測定して、選択したフォントサイズに適した文字幅係数を掛けます。

また、行のバンド分けロジックとは独立して、C# を使用して Excel セルに背景色を適用することで、よりきめ細かなスタイル設定を行うこともできます。

GridViewコントロールを使用せずにデータテーブルをExcelにエクスポートするにはどうすればよいですか?

多く for .NETアプリケーションは、サービス呼び出しやデータベースクエリによってデータを取得し、UI コントロールにバインドすることなく DataTable に保持します。 GridView をインスタンス化することなく、DataTable を直接 Excel にエクスポートできます。

これは、バックグラウンドジョブ、スケジュールされたレポート、およびサーバー上でExcelファイルを生成する必要があるAPIエンドポイントにとって最も効率的な方法です。

using IronXL;
using IronXl.Styles;
using System.Data;

public static byte[] DataTableToExcelBytes(DataTable dt, string sheetName = "Report")
{
    WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet sheet = workBook.CreateWorkSheet(sheetName);

    // Header
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
        var cell = sheet.GetCellAt(0, col);
        cell.Style.Font.Bold = true;
        cell.Style.SetBackgroundColor("#4472C4");
        cell.Style.Font.Color = "#FFFFFF";
    }

    // Data
    for (int row = 0; row < dt.Rows.Count; row++)
    {
        for (int col = 0; col < dt.Columns.Count; col++)
        {
            sheet.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);
        }
    }

    return workBook.ToByteArray();
}
using IronXL;
using IronXl.Styles;
using System.Data;

public static byte[] DataTableToExcelBytes(DataTable dt, string sheetName = "Report")
{
    WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet sheet = workBook.CreateWorkSheet(sheetName);

    // Header
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
        var cell = sheet.GetCellAt(0, col);
        cell.Style.Font.Bold = true;
        cell.Style.SetBackgroundColor("#4472C4");
        cell.Style.Font.Color = "#FFFFFF";
    }

    // Data
    for (int row = 0; row < dt.Rows.Count; row++)
    {
        for (int col = 0; col < dt.Columns.Count; col++)
        {
            sheet.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);
        }
    }

    return workBook.ToByteArray();
}
Imports IronXL
Imports IronXl.Styles
Imports System.Data

Public Shared Function DataTableToExcelBytes(dt As DataTable, Optional sheetName As String = "Report") As Byte()
    Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim sheet As WorkSheet = workBook.CreateWorkSheet(sheetName)

    ' Header
    For col As Integer = 0 To dt.Columns.Count - 1
        sheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
        Dim cell = sheet.GetCellAt(0, col)
        cell.Style.Font.Bold = True
        cell.Style.SetBackgroundColor("#4472C4")
        cell.Style.Font.Color = "#FFFFFF"
    Next

    ' Data
    For row As Integer = 0 To dt.Rows.Count - 1
        For col As Integer = 0 To dt.Columns.Count - 1
            sheet.SetCellValue(row + 1, col, If(dt.Rows(row)(col)?.ToString(), String.Empty))
        Next
    Next

    Return workBook.ToByteArray()
End Function
$vbLabelText   $csharpLabel

このメソッドは、ディスクに書き込んだり、APIエンドポイントからストリーミングしたり、メールに添付したり、メモリにキャッシュしたりできるbyte[]を返します。 関連するテクニックについては、 DataTableをExcelにエクスポートする方法に関するガイドと、 DataTableをExcelにエクスポートする最速の方法に関するチュートリアルを参照してください。

大規模データセットとパフォーマンスをどのように処理していますか?

数万行ものデータをExcelにエクスポートする場合、メモリ割り当てに注意を払う必要がある。 大きなグリッド内の各セルに対して新しいセル型オブジェクトを作成することが、最も一般的なパフォーマンス上のボトルネックです。 スタイル定義は可能な限り再利用し、個々のセルではなく範囲オブジェクトにスタイルを設定してください。

データセットサイズ別のIronXLエクスポート方法
データセットのサイズ 推奨されるアプローチ 重要な考慮事項
最大5,000行 細胞ごとのスタイリングループ シンプルなコード、オーバーヘッドはごくわずか
5,000~50,000行 レンジレベルスタイルのアプリケーション オブジェクト割り当てを大幅に削減します
50,000行以上 データテーブルの直接エクスポート、最小限のスタイル設定 セルごとの操作を最小限に抑え、可能であればストリーミングを使用する。

ページ分割された GridView の場合は、エクスポートする前に必ず AllowPaging = false を設定し、再バインドしてください。 ページングは​​コントロールに表示される行数を制限するため、ページングされたエクスポートではデータセット全体ではなく現在のページのみが取得されます。これは、エクスポートが不完全になるバグの頻繁な原因となります。

また、型指定のない行ではなく、厳密に型指定されたコレクションで機能するパターンについては、C# でオブジェクトのリストを Excel にエクスポートするガイドを参照してください。

ASP.NET CoreまたはBlazorでGridViewをエクスポートするにはどうすればよいですか?

ASP.NET CoreおよびBlazorアプリケーションには Web Forms コントロールはありませんが、基盤となるデータエクスポートの課題は同じです。オブジェクトのコレクションまたは DataTable を取得し、スタイル付きワークブックを作成して、ファイルを配信します。ワークブック作成コードは同一です。 配送方法だけが変わる。

Blazorアプリケーションで、 JavaScript相互運用機能を使用してファイルダウンロードをトリガーする:

// In a Blazor component or service
using IronXL;
using System.Data;
using Microsoft.JSInterop;

public async Task ExportToExcelAsync(DataTable dt, IJSRuntime js)
{
    WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet sheet = workBook.DefaultWorkSheet;

    for (int col = 0; col < dt.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
        var cell = sheet.GetCellAt(0, col);
        cell.Style.Font.Bold = true;
        cell.Style.SetBackgroundColor("#4472C4");
        cell.Style.Font.Color = "#FFFFFF";
    }

    for (int row = 0; row < dt.Rows.Count; row++)
    {
        for (int col = 0; col < dt.Columns.Count; col++)
        {
            sheet.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);
        }
    }

    byte[] fileBytes = workBook.ToByteArray();
    string base64 = Convert.ToBase64String(fileBytes);
    await js.InvokeVoidAsync("downloadFileFromBase64", base64, "GridViewExport.xlsx",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
// In a Blazor component or service
using IronXL;
using System.Data;
using Microsoft.JSInterop;

public async Task ExportToExcelAsync(DataTable dt, IJSRuntime js)
{
    WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet sheet = workBook.DefaultWorkSheet;

    for (int col = 0; col < dt.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
        var cell = sheet.GetCellAt(0, col);
        cell.Style.Font.Bold = true;
        cell.Style.SetBackgroundColor("#4472C4");
        cell.Style.Font.Color = "#FFFFFF";
    }

    for (int row = 0; row < dt.Rows.Count; row++)
    {
        for (int col = 0; col < dt.Columns.Count; col++)
        {
            sheet.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);
        }
    }

    byte[] fileBytes = workBook.ToByteArray();
    string base64 = Convert.ToBase64String(fileBytes);
    await js.InvokeVoidAsync("downloadFileFromBase64", base64, "GridViewExport.xlsx",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
Imports IronXL
Imports System.Data
Imports Microsoft.JSInterop

Public Async Function ExportToExcelAsync(dt As DataTable, js As IJSRuntime) As Task
    Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim sheet As WorkSheet = workBook.DefaultWorkSheet

    For col As Integer = 0 To dt.Columns.Count - 1
        sheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
        Dim cell = sheet.GetCellAt(0, col)
        cell.Style.Font.Bold = True
        cell.Style.SetBackgroundColor("#4472C4")
        cell.Style.Font.Color = "#FFFFFF"
    Next

    For row As Integer = 0 To dt.Rows.Count - 1
        For col As Integer = 0 To dt.Columns.Count - 1
            sheet.SetCellValue(row + 1, col, If(dt.Rows(row)(col)?.ToString(), String.Empty))
        Next
    Next

    Dim fileBytes As Byte() = workBook.ToByteArray()
    Dim base64 As String = Convert.ToBase64String(fileBytes)
    Await js.InvokeVoidAsync("downloadFileFromBase64", base64, "GridViewExport.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
End Function
$vbLabelText   $csharpLabel

Blazorのダウンロードパターンの詳細な手順については、 BlazorからExcelへのエクスポートチュートリアルを参照してください。 ASP.NET Coreコントローラーを使用したアプローチについては、 ASP.NET Core のExcel エクスポートチュートリアルを参照してください。

フォントスタイルと枠線オプション

IronXL は、各セル上の Style オブジェクトを通じて、きめ細かなフォントと境界線の制御を提供します。 C# で利用できる Excel のフォントスタイルには、太字、斜体、下線、サイズ、色など、あらゆる種類が含まれています。 BorderType で利用可能な枠線の種類には、細線、中線、太線、破線、点線、二重線、およびいくつかのヘアラインバリエーションが含まれます。

IronXLは、ヘッダー行やサマリーフッターを結合する場合、 C#を使用してExcelのセルを結合することもサポートしています。これは、データテーブルの上に複数の列にまたがる単一のタイトルセルを作成したい場合に便利です。

データ入力後に列幅を自動調整するには、推奨される方法について、 Excel で C# を使用してセルを自動調整する方法に関するガイドを参照してください。

なぜネイティブのExcelライブラリはHtmlTextWriterよりもきれいなエクスポートファイルを作成するのか?

従来のASP.NETエクスポート手法 ( VerifyRenderingInServerForm をオーバーライドし、 StringWriterHtmlTextWriter を作成し、レンダリングされたコントロールをレスポンスに書き込む) では、 .xls 拡張子を持つ HTML ドキュメントが生成されます。 Microsoft Excel は、このようなファイルを開く際に互換性に関する警告を表示します。これは、ファイルが実際には Excel バイナリ形式または OOXML 形式ではないためです。 スタイルは、Excelが部分的に解釈するインラインCSSに限定されます。 条件付き書式設定は不可能です。 Windows以外のプラットフォームを使用しているユーザー、またはLibreOfficeを使用しているユーザーは、出力品質が低下します。

IronXLはOpen XMLスプレッドシート形式(OOXML)を直接出力します。 その結果、Excel自体が作成するものと全く同じ、適切な.xlsxファイルが生成され、macOS上のExcel、LibreOffice、Google Sheets、Numbersで警告なしに開くことができます。 書式設定はHTML属性ではなくスプレッドシートのスタイルとしてエンコードされるため、データの送受信や異なるプラットフォームでの表示でも維持されます。

ASP.NET GridViewのエクスポート方法の比較
方法 ファイル形式 書式に関する警告 フルスタイルサポート オフィス必須
HtmlTextWriter + StringWriter XLSを装ったHTML はい なし なし
Office Interop (COM) ネイティブXLS/XLSX なし はい はい
IronXL ネイティブXLSX/XLS なし はい なし

Microsoftの公式ドキュメントであるOpen XML SDKには、 IronXLが生成する基本フォーマットについて説明されています。 ECMA Internationalが管理するOOXML仕様は、アプリケーション間の互換性を保証する標準を定義している。 Microsoft Docs のASP.NET GridView コントロールのドキュメントには、上記のエクスポート パターンが読み取るコントロール モデルについて説明されています。

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

これで、 IronXLを使用してGridViewおよびDataGridViewのデータを適切な形式のXLSXファイルにエクスポートするために必要なパターンが揃いました。Windows Forms、 ASP.NET Web Forms、 ASP.NET Core、およびBlazorの配信モデルに対応しています。

さらに詳しく知りたい場合は:

IronXLの無料トライアルを開始して、ご自身のデータを使ってフォーマット機能とエクスポート機能をすべてテストしてみてください。

よくある質問

C# で GridView データを Excel にエクスポートするにはどうすればよいですか?

IronXLライブラリを使用すると、C#でGridViewデータをExcelにエクスポートできます。プログラムでExcelファイルを作成し、書式設定やスタイルを含めたデータを簡単にエクスポートできます。

GridView データをエクスポートするのにIronXLを使用する必要があるのはなぜですか?

IronXL は直感的な API を使用して GridView データのエクスポート プロセスを簡素化し、従来の方法では困難だった書式設定の維持やスタイルの適用を簡単に実行できるようにします。

IronXL は、GridView を Excel にエクスポートする際の書式設定をサポートしていますか?

はい、 IronXL はフォント、色、セル スタイルなどのさまざまな書式設定オプションをサポートしており、エクスポートされた Excel ファイルがプロフェッショナルな外観になり、意図したデザインが維持されます。

GridView データから生成された Excel ファイルの外観をカスタマイズできますか?

IronXL はExcel ファイル用のさまざまなカスタマイズ オプションを提供しており、GridView からエクスポートするときに、特定の要件に合わせてセルのスタイル、フォント、色などを調整できます。

IronXLを使用して大規模な GridView データセットを Excel にエクスポートすることは可能ですか?

IronXLは大規模なデータセットを効率的に処理できるため、パフォーマンスの問題が発生することなく、広範な GridView データを Excel にエクスポートできます。

他の方法と比べて、 IronXLを使用して GridView データを Excel にエクスポートする利点は何ですか?

IronXL は、GridView データをエクスポートするためのより合理的で柔軟なアプローチを提供し、フォーマット、カスタマイズ、大規模なデータセットの処理に対する強力なサポートを提供するため、他の多くの方法よりも優れています。

GridView を Excel にエクスポートするときにデータの整合性を維持するにはどうすればよいですか?

IronXL は、GridView から Excel へのエクスポート プロセス中にデータの種類と形式を正確に変換および保持することで、データの整合性を保証します。

IronXL は複雑な構造の GridView コントロールからデータをエクスポートできますか?

はい、 IronXL は、複雑な構造を持つ GridView コントロールからデータを効果的に処理してエクスポートし、結果の Excel ファイルで階層と書式を維持できます。

IronXL はGridView データをどのようなファイル形式でエクスポートできますか?

IronXL は主に XLSX などの Excel 形式にデータをエクスポートしますが、CSV などの他の形式もサポートしているため、ニーズに応じて柔軟に対応できます。

IronXLを使用して条件付き書式で GridView をエクスポートすることはサポートされていますか?

IronXL は条件付き書式をサポートしており、GridView データを Excel にエクスポートするときにセルの値に基づいて動的に調整されるルールとスタイルを設定できます。

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

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

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

アイアンサポートチーム

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