跳至页脚内容
使用 IRONXL

如何使用IronXL在 C# 中将 DataGridView 导出到 Excel

使用IronXL,从DataGridView导出数据到Excel文件只需几行C#代码。 创建一个.xlsx文件——无需安装Microsoft Office。

如何设置Windows Forms项目进行Excel导出?

Windows Forms是.NET生态系统中的一个基础GUI库,广泛用于构建桌面应用程序。 DataTable、数据库查询结果或内存列表。

导出网格数据到Excel可以服务于日常需求——向利益相关者发送报告、归档快照以供审计,或将数据输入下游分析工具。 传统的两种方法是Microsoft Office Interop和第三方库。 Interop要求在运行应用程序的每台机器上安装Excel副本,创建COM对象生命周期问题,并且在服务器或云部署中性能不佳。 如IronXL、ClosedXML和Syncfusion等库通过直接写入Open XML文件格式而无需Office依赖,避免了这些问题。

本指南展示了IronXL在C#中针对.NET 10的方法,尽管IronXL支持.NET Framework 4.6.2及所有现代.NET版本

前提条件

在编写任何导出代码之前,请确认以下已就位:

  • Visual Studio 2022 或更高版本
  • .NET 10 SDK已安装
  • 包含DataGridView控件的Windows Forms App项目
  • 可以安装IronXL的NuGet访问权限

如何安装IronXL?

在Visual Studio中打开包管理器控制台并运行以下命令之一:

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

或者,在解决方案资源管理器中右键单击项目,选择管理NuGet包,搜索IronXl.Excel并点击安装

使用IronXL在VB .NET 2010中从DataGridView导出数据到Excel:图1 - 安装

安装后,在任何使用Excel功能的文件顶部添加IronXL使用指令:

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

IronXL支持所有常见的电子表格格式:XLSX, XLS, CSV和TSV。 本指南使用整个XLSX,因为它是现代Excel版本的默认格式。

如何使用示例数据填充DataGridView?

在本演练中,窗体包含一个名为btnExport的按钮。 该网格在窗体的DataTable中的员工记录填充:

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

    // Define columns with the appropriate .NET type
    dt.Columns.Add("EmployeeID", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Department", typeof(string));
    dt.Columns.Add("Salary", typeof(decimal));

    // Add sample rows
    dt.Rows.Add(101, "Sarah Johnson", "Engineering", 85000m);
    dt.Rows.Add(102, "Michael Chen", "Marketing", 72000m);
    dt.Rows.Add(103, "Emily Davis", "Finance", 91000m);
    dt.Rows.Add(104, "James Wilson", "Engineering", 78000m);

    DataGridView1.DataSource = dt;
}
void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();

    // Define columns with the appropriate .NET type
    dt.Columns.Add("EmployeeID", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Department", typeof(string));
    dt.Columns.Add("Salary", typeof(decimal));

    // Add sample rows
    dt.Rows.Add(101, "Sarah Johnson", "Engineering", 85000m);
    dt.Rows.Add(102, "Michael Chen", "Marketing", 72000m);
    dt.Rows.Add(103, "Emily Davis", "Finance", 91000m);
    dt.Rows.Add(104, "James Wilson", "Engineering", 78000m);

    DataGridView1.DataSource = dt;
}
$vbLabelText   $csharpLabel

每列都定义了一个特定的.NET类型,以便以后数字比较和格式化能正确工作。 DataGridView,并且网格在窗体打开时自动呈现所有行。 在生产中,此数据通常来自数据库查询、ORM结果集或REST API响应,而不是硬编码值。

使用IronXL在VB .NET 2010中从DataGridView导出数据到Excel:图2 - DataGridView输出

了解DataGridView数据模型

一个Rows(用于实际的数据单元)。 每个Cells集合。 每个单元格的Value属性返回一个需要在写入Excel单元格之前进行强制转换或转换的装箱对象。 理解这一层级对于编写可靠的导出循环至关重要。

幕后DataTable存储类型化值,因此在写入IronXL工作表之前,十进制薪水不需要字符串转换。 IronXL的DateTime重载,允许您在输出文件中保留原始数据类型。

如何将DataGridView数据导出到带有列标题的Excel文件?

导出逻辑位于按钮的单击处理程序内。 代码创建一个新的WorkBook,检索默认工作表,将列标题写入第一行,然后将每一行数据写在其下:

void btnExport_Click(object sender, EventArgs e)
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

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

    // Write data rows starting at row index 1
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is not null)
            {
                sheet.SetCellValue(row + 1, col, cellValue.ToString()!);
            }
        }
    }

    string outputPath = "EmployeeData.xlsx";
    workbook.SaveAs(outputPath);
    MessageBox.Show("Export complete. File saved to: " + outputPath, "Success");
}
void btnExport_Click(object sender, EventArgs e)
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

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

    // Write data rows starting at row index 1
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is not null)
            {
                sheet.SetCellValue(row + 1, col, cellValue.ToString()!);
            }
        }
    }

    string outputPath = "EmployeeData.xlsx";
    workbook.SaveAs(outputPath);
    MessageBox.Show("Export complete. File saved to: " + outputPath, "Success");
}
$vbLabelText   $csharpLabel

WorkBook对象表示内存中的整个Excel文件。 DefaultWorkSheet返回第一个工作表,无需显式创建工作表。 外部循环将HeaderText中的标题文本写入第零行。 嵌套循环接着迭代每一个数据行,在将单元格值转换为字符串之前检查是否为空。 row + 1偏移让数据位于标题行之下。 SaveAs将完成的工作簿作为Open XML XLSX文件写入指定路径。

使用IronXL在VB .NET 2010中从DataGridView导出数据到Excel:图3 - Excel输出

生成的文件可以在Excel、Google Sheets或任何读取XLSX格式的应用程序中打开。 列标题出现在第一行,并且所有数据行按照在DataGridView中出现的相同顺序排列。

如何应用单元格格式到导出的Excel文件?

简单的数据转储是功能性的但不适合展示。 IronXL的样式API允许您在保存前对任何单元格范围应用粗体、背景颜色、文本颜色和数字格式:

void ExportWithFormatting()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

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

    // Style the header row: bold white text on blue background
    var headerRange = sheet.GetRange("A1:D1");
    headerRange.Style.Font.Bold = true;
    headerRange.Style.SetBackgroundColor("#4472C4");
    headerRange.Style.Font.SetColor("#FFFFFF");

    // Locate the Salary column index
    int salaryColIndex = -1;
    for (int i = 0; i < DataGridView1.Columns.Count; i++)
    {
        if (string.Equals(DataGridView1.Columns[i].HeaderText, "Salary",
            StringComparison.OrdinalIgnoreCase))
        {
            salaryColIndex = i;
            break;
        }
    }

    // Write data rows, preserving numeric types
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is null) continue;

            int targetRow = row + 1;

            if (col == salaryColIndex)
            {
                // Write salary as a true numeric decimal
                if (decimal.TryParse(cellValue.ToString(),
                    System.Globalization.NumberStyles.Number,
                    System.Globalization.CultureInfo.InvariantCulture,
                    out decimal decValue))
                {
                    sheet.SetCellValue(targetRow, col, decValue);
                }
                else
                {
                    sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
                }
            }
            else
            {
                sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
            }
        }
    }

    // Apply currency format to the salary column data range
    var salaryRange = sheet.GetRange("D2:D5");
    salaryRange.FormatString = "$#,##0";

    workbook.SaveAs("FormattedEmployeeData.xlsx");
}
void ExportWithFormatting()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

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

    // Style the header row: bold white text on blue background
    var headerRange = sheet.GetRange("A1:D1");
    headerRange.Style.Font.Bold = true;
    headerRange.Style.SetBackgroundColor("#4472C4");
    headerRange.Style.Font.SetColor("#FFFFFF");

    // Locate the Salary column index
    int salaryColIndex = -1;
    for (int i = 0; i < DataGridView1.Columns.Count; i++)
    {
        if (string.Equals(DataGridView1.Columns[i].HeaderText, "Salary",
            StringComparison.OrdinalIgnoreCase))
        {
            salaryColIndex = i;
            break;
        }
    }

    // Write data rows, preserving numeric types
    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cellValue = DataGridView1.Rows[row].Cells[col].Value;
            if (cellValue is null) continue;

            int targetRow = row + 1;

            if (col == salaryColIndex)
            {
                // Write salary as a true numeric decimal
                if (decimal.TryParse(cellValue.ToString(),
                    System.Globalization.NumberStyles.Number,
                    System.Globalization.CultureInfo.InvariantCulture,
                    out decimal decValue))
                {
                    sheet.SetCellValue(targetRow, col, decValue);
                }
                else
                {
                    sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
                }
            }
            else
            {
                sheet.SetCellValue(targetRow, col, cellValue.ToString()!);
            }
        }
    }

    // Apply currency format to the salary column data range
    var salaryRange = sheet.GetRange("D2:D5");
    salaryRange.FormatString = "$#,##0";

    workbook.SaveAs("FormattedEmployeeData.xlsx");
}
$vbLabelText   $csharpLabel

A1:D1)来选择一个连续的单元格块。 设置Style.Font.SetColor将这些格式应用于所选范围内的每个单元格。 对于数字列,以$#,##0这样的数字格式。 存储为字符串的单元格不响应数字格式代码。

使用IronXL在VB .NET 2010中从DataGridView导出数据到Excel:图4 - 格式化的Excel输出

您可以扩展此模式,通过查阅IronXL样式文档,应用交替行着色、列宽自动适应或冻结窗格。

如何将DataGridView数据导出到CSV而不是XLSX?

某些工作流需要CSV输出以兼容遗留系统或轻量级数据管道。 IronXL无需对主代码进行任何额外配置更改即可处理CSV导出:

void ExportToCsv()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cell = DataGridView1.Rows[row].Cells[col].Value;
            if (cell is not null)
                sheet.SetCellValue(row + 1, col, cell.ToString()!);
        }
    }

    // Saving with a .csv extension produces a comma-separated file
    workbook.SaveAs("EmployeeData.csv");
}
void ExportToCsv()
{
    var workbook = WorkBook.Create();
    var sheet = workbook.DefaultWorkSheet;

    for (int col = 0; col < DataGridView1.Columns.Count; col++)
    {
        sheet.SetCellValue(0, col, DataGridView1.Columns[col].HeaderText);
    }

    for (int row = 0; row < DataGridView1.Rows.Count; row++)
    {
        if (DataGridView1.Rows[row].IsNewRow) continue;

        for (int col = 0; col < DataGridView1.Columns.Count; col++)
        {
            object? cell = DataGridView1.Rows[row].Cells[col].Value;
            if (cell is not null)
                sheet.SetCellValue(row + 1, col, cell.ToString()!);
        }
    }

    // Saving with a .csv extension produces a comma-separated file
    workbook.SaveAs("EmployeeData.csv");
}
$vbLabelText   $csharpLabel

从XLSX导出的唯一更改是传递给SaveAs的文件扩展名。 IronXL检测到扩展名并自动以正确的格式序列化工作簿。 这种一致性意味着您的数据写入逻辑无论输出格式如何都保持不变——这与需要为每种格式制定单独代码路径的库相比具有显著优势。

CSV导出尤其有用,当下游消费者是Python pandas脚本、数据库批量导入工具或无法读取二进制XLSX文件的分析平台时。

如何有效处理大型DataGridView数据集?

对于包含数万行的网格,性能成为一个考虑因素。 以下模式通过在一次遍历中构建完整数据集来减小内存压力:

IronXL导出方法比较,适用于大型数据集
方法 处理的行数 是否需要Office 类型保留
Microsoft.Office.Interop.Excel 最多~65k(慢) 部分
IronXL(字符串单元格) 100万+行 否(所有文本)
IronXL(类型化单元格) 100万+行
IronXL从DataTable 100万+行 是(自动)

DataTable时,可以使用WorkSheet.LoadDataTable方法直接加载表到IronXL,完全绕过逐单元格迭代。 此方法更快并自动保留所有列类型。

对于没有被DataTable支持的网格,之前展示的逐单元格模式仍是标准方法。 如果您需要异步导出来保持大规模导出期间的UI响应性,将导出逻辑封装在await结果。 请参阅异步文件操作文档以获取将结果调度回UI线程的模式。

为什么IronXL比Office Interop更适合DataGridView导出?

传统的.NET解决方案使用Microsoft.Office.Interop.Excel来驱动运行的Excel进程。 这种方法产生了几个部署和可靠性问题:

  • 运行应用程序的每台机器都需要安装Microsoft Excel的许可副本
  • 服务器环境和云容器通常无法安装Office
  • COM Interop需要显式释放每个对象以避免内存泄漏和僵尸Excel进程
  • 跨COM边界的错误处理冗长且易碎
  • 随着行数增长,性能迅速下降

IronXL直接写入OOXML文件格式,无需启动任何外部进程。 应用程序作为独立单元进行部署。 库的API是完全托管.NET,因此垃圾回收自动处理内存,无需Marshal.ReleaseComObject调用。 因为没有跨进程通信,速度显著提高。

对于评估替代方案的团队,ClosedXML是一个流行的开源选项。 IronXL提供更广泛的功能集,包括PDF转换图表生成和商业支持,这可能是企业采购决策中的考虑因素。 查看IronXL许可选项以将合适的层级匹配到您的团队规模和部署场景。

功能比较:IronXL与Office Interop
特征 IronXL Office Interop
需要安装Office
服务器/云部署 不(不支持)
托管内存模型 否(需要COM清理)
XLSX / CSV / XLS格式 所有三种格式 依赖所安装的Excel
从电子表格导出PDF 需要额外的库

IronXL教程部分涵盖读取现有Excel文件、修改模板、生成图表和应用条件格式——所有这些能力都自然地扩展自这里展示的DataGridView导出模式。

接下来您的步骤是什么?

您现在已经有了使用IronXL将DataGridView导出到格式化Excel文件的C#代码。 从这里开始,可以考虑以下方向:

  • 添加错误处理:将导出代码封装在try/catch块中,并在文件被锁定或路径无效时显示用户友好的消息
  • 支持文件路径选择:使用SaveFileDialog让用户在运行时选择输出位置和文件名
  • 加载真实数据:使用ADO.NET或Entity Framework替换示例DataTable为数据库查询
  • 读取现有文件:使用WorkBook.Load打开现有电子表格并更新而不是总是创建新的
  • 导出到多张表:在同一个WorkSheet对象来组织相关的数据集
  • 应用条件格式化:使用IronXL的条件格式化API突出显示超过阈值的单元格
  • 查看许可证选项:有一个免费试用许可层级覆盖从个人开发者到企业部署
  • 浏览完整的API参考IronXL对象参考记录了每个可用的类和方法

常见问题解答

在 C# 中,将 DataGridView 数据导出到 Excel 的最简单方法是什么?

使用IronXL,您可以通过一个简单的 C# 循环将 DataGridView 数据导出到 Excel。该循环会将列标题和数据行写入 WorkBook 对象,然后调用 SaveAs 函数生成 XLSX 文件。无需安装 Microsoft Office。

如何在 C# Windows Forms 应用程序中使用IronXL处理 Excel 文件?

通过NuGet安装IronXL ,添加 using IronXL指令,使用 WorkBook.Create() 创建工作簿,使用 SetCellValue 写入数据,并使用 SaveAs 保存。IronXL 支持IronXL 、XLS 和 CSV 格式。

IronXl.Excel 是否支持将大型 DataGridView 数据集导出到 Excel?

是的, IronXL可以高效地处理大型数据集。对于由 DataTable 支持的 DataGridView,您可以使用 LoadDataTable 方法绕过逐个单元格的迭代,从而获得更佳的性能。

使用IronXL需要安装 Microsoft Excel 吗?

不IronXL直接写入 Open XML 文件格式,无需启动 Excel 或任何 COM 自动化程序。使用IronXL构建的应用程序可以部署到没有 Office 的服务器和云环境中。

与 Office Interop 相比,使用IronXL进行 Excel 导出有哪些优势?

IronXL无需安装 Office,避免了 COM 内存泄漏问题,支持服务器和云部署,并提供简洁的托管.NET API 用于读取和写入 XLSX、XLS 和 CSV 文件。

IronXL能否将 DataGridView 数据导出为 CSV 和 XLSX 格式?

是的。将 .csv 文件路径传递给 WorkBook.SaveAs 会生成一个逗号分隔的文件。两种格式的数据写入代码完全相同——只有文件扩展名不同。

如何使用IronXL对导出的 Excel 单元格应用格式?

使用 WorkSheet.GetRange 选择单元格区域,然后访问 Style 属性来设置 Font.Bold、SetBackgroundColor、Font.SetColor 和 FormatString 以设置数字格式。

如何在 C# 项目中开始使用IronXL ?

在您的项目中运行Install-Package IronXL或 dotnet add package IronXL ,在文件顶部添加 using IronXL ,并按照 ironsoftware.com/csharp/excel/ 上的IronXL文档中的示例进行操作。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

Iron Support Team

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