使用 IRONXL 如何使用IronXL在 C# 中将 DataGridView 导出到 Excel Curtis Chau 已更新:2026年3月1日 下载 IronXL NuGet 下载 DLL 下载 免费试用 LLM副本 LLM副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 使用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并点击安装。 安装后,在任何使用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响应,而不是硬编码值。 了解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文件写入指定路径。 生成的文件可以在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样式文档,应用交替行着色、列宽自动适应或冻结窗格。 如何将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 机器人,将他对技术的热爱与创造力相结合。 相关文章 已更新2026年3月1日 在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式 使用 C# 和IronXL在ASP.NET Core中下载 Excel 文件。从 MVC 控制器导出数据到 XLSX、CSV 和 XML 格式,并返回 MemoryStream 和 File() 函数。包含代码示例。 阅读更多 已更新2026年3月1日 如何在Blazor中使用IronXL导出 Excel 文件 学习如何使用IronXL在Blazor Server 应用程序中将数据导出到 Excel。本指南涵盖项目设置、服务设计、条件格式设置、多工作表报表和错误处理,并提供完整的 C# 代码示例。 阅读更多 已更新2026年2月27日 如何在 C# 中读取 Excel 文件而不是使用 StreamReader 了解为什么 StreamReader 无法读取 Excel 文件,以及如何在 C# .NET中使用IronXL从磁盘或内存流加载 XLSX 和 XLS 工作簿。 阅读更多 如何使用IronXL在 C# 中读取 Excel 文件如何使用IronXL在 C# 中快速...
已更新2026年3月1日 在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式 使用 C# 和IronXL在ASP.NET Core中下载 Excel 文件。从 MVC 控制器导出数据到 XLSX、CSV 和 XML 格式,并返回 MemoryStream 和 File() 函数。包含代码示例。 阅读更多
已更新2026年3月1日 如何在Blazor中使用IronXL导出 Excel 文件 学习如何使用IronXL在Blazor Server 应用程序中将数据导出到 Excel。本指南涵盖项目设置、服务设计、条件格式设置、多工作表报表和错误处理,并提供完整的 C# 代码示例。 阅读更多
已更新2026年2月27日 如何在 C# 中读取 Excel 文件而不是使用 StreamReader 了解为什么 StreamReader 无法读取 Excel 文件,以及如何在 C# .NET中使用IronXL从磁盘或内存流加载 XLSX 和 XLS 工作簿。 阅读更多