使用 IRONXL 如何使用 Interop 与 IronXL.Excel 将 DataTable 导出到 Excel C# Curtis Chau 已发布:2026年1月12日 下载 IronXL NuGet 下载 DLL 下载 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 数据导出到 Excel 文件简介 对于需要高效地分析、可视化和共享信息的组织而言,将数据从数据库或应用程序导出到 Excel 文件是一项基本要求。 Excel 文件因其用户友好的界面而广受认可,使用户能够轻松地与数据进行交互和解释。 通过将数据集转换为 .XLSX 格式,开发人员可以确保数据保持可访问性和结构化,而无需考虑用户的技术背景。 该过程不仅可以保持原始数据集的完整性,还可以实现系统之间的无缝数据传输。 为了实现这一点,开发人员可以利用各种 Excel 库,例如 IronXL、EPPlus、NPOI 和 ClosedXML,从而以编程方式创建、读取和操作 Excel 文件,而无需在服务器或客户端计算机上安装 Microsoft Excel。这些库使用户能够生成专业的 Excel 格式报告和数据导出,从而满足各种业务和分析需求。 Interop 和 IronXL 的主要区别是什么? 在深入代码之前,了解这两种方法之间的根本区别有助于为任何项目做出正确的选择。 比较内容涵盖技术架构、部署要求以及使用 DataTable 导出到 Excel 场景时的实际开发经验。 特征 Microsoft Office Interop IronXL 需要安装办公软件 是的——必须安装 Microsoft Excel。 否——独立库 服务器端支持 微软不推荐 完全支持 平台支持 仅限 Windows 系统 Windows、Linux、macOS、Azure 支持 .NET Core/.NET 5+ 有限的 完全支持(.NET 6、7、8、9、10) 资源管理 需要清理 COM 对象 标准 .NET 处置 安装方法 COM 参考 + Office 安装 通过 NuGet 安装包 螺纹模型 单线程公寓 (STA) 线程安全操作 大型数据集 内存密集型进程 高效的基于文件的方法 文件格式 XLSX、XLS、CSV XLSX、XLS、CSV、JSON、XML 许可 需要 Office 许可证 商业许可可获取 架构上的差异是根本性的:Excel Interop 通过 COM 自动执行 Microsoft Excel 应用程序本身,而 IronXL 直接读取和写入 Excel 文件格式,无需启动任何外部进程。 这种区别会影响从内存使用到部署复杂性等方方面面。 如何使用 Interop 将数据表导出到 Excel C#? 传统方法是使用Microsoft.Office.Interop.Excel命名空间直接自动化 Excel。 此方法要求在运行代码的计算机上安装 Microsoft Excel。 前提条件 使用互操作之前,请确保: 开发和部署计算机上都安装了 Microsoft Excel。 在 Visual Studio 中添加对"Microsoft Excel 对象库"的 COM 引用 包含Microsoft.Office.Interop.Excel命名空间 互操作代码示例 以下代码演示了如何使用 Microsoft Office Interop 将DataTable导出到 Excel 文件: using Microsoft.Office.Interop.Excel; using System.Data; using System.Runtime.InteropServices; // Create a sample DataTable with employee data DataTable dt = new DataTable("Employees"); dt.Columns.Add("EmployeeID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Department", typeof(string)); dt.Columns.Add("Salary", typeof(decimal)); // Fill the DataTable with sample rows dt.Rows.Add(1, "John Smith", "Engineering", 75000); dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000); dt.Rows.Add(3, "Michael Chen", "Finance", 70000); dt.Rows.Add(4, "Emily Davis", "Engineering", 80000); // Initialize Excel Application object Application excelApp = new Application { Visible = false, DisplayAlerts = false }; // Create new Workbook and get the active Worksheet Workbook workbook = excelApp.Workbooks.Add(); Worksheet worksheet = (Worksheet)workbook.ActiveSheet; try { // Write column headers to the first row for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; } // Write data rows starting from row 2 for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString(); } } // Define file path and save the Excel file string filePath = @"C:\Reports\EmployeeReport_Interop.xlsx"; workbook.SaveAs(filePath); Console.WriteLine("Excel file created successfully using Interop."); } catch (Exception ex) { Console.WriteLine("Error exporting data to Excel: " + ex.Message); } finally { // Close workbook and quit Excel application workbook.Close(); excelApp.Quit(); // Critical: Release COM objects to prevent memory leaks Marshal.ReleaseComObject(worksheet); Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(excelApp); } using Microsoft.Office.Interop.Excel; using System.Data; using System.Runtime.InteropServices; // Create a sample DataTable with employee data DataTable dt = new DataTable("Employees"); dt.Columns.Add("EmployeeID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Department", typeof(string)); dt.Columns.Add("Salary", typeof(decimal)); // Fill the DataTable with sample rows dt.Rows.Add(1, "John Smith", "Engineering", 75000); dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000); dt.Rows.Add(3, "Michael Chen", "Finance", 70000); dt.Rows.Add(4, "Emily Davis", "Engineering", 80000); // Initialize Excel Application object Application excelApp = new Application { Visible = false, DisplayAlerts = false }; // Create new Workbook and get the active Worksheet Workbook workbook = excelApp.Workbooks.Add(); Worksheet worksheet = (Worksheet)workbook.ActiveSheet; try { // Write column headers to the first row for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; } // Write data rows starting from row 2 for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString(); } } // Define file path and save the Excel file string filePath = @"C:\Reports\EmployeeReport_Interop.xlsx"; workbook.SaveAs(filePath); Console.WriteLine("Excel file created successfully using Interop."); } catch (Exception ex) { Console.WriteLine("Error exporting data to Excel: " + ex.Message); } finally { // Close workbook and quit Excel application workbook.Close(); excelApp.Quit(); // Critical: Release COM objects to prevent memory leaks Marshal.ReleaseComObject(worksheet); Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(excelApp); } Imports Microsoft.Office.Interop.Excel Imports System.Data Imports System.Runtime.InteropServices ' Create a sample DataTable with employee data Dim dt As New DataTable("Employees") dt.Columns.Add("EmployeeID", GetType(Integer)) dt.Columns.Add("Name", GetType(String)) dt.Columns.Add("Department", GetType(String)) dt.Columns.Add("Salary", GetType(Decimal)) ' Fill the DataTable with sample rows dt.Rows.Add(1, "John Smith", "Engineering", 75000) dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000) dt.Rows.Add(3, "Michael Chen", "Finance", 70000) dt.Rows.Add(4, "Emily Davis", "Engineering", 80000) ' Initialize Excel Application object Dim excelApp As New Application With { .Visible = False, .DisplayAlerts = False } ' Create new Workbook and get the active Worksheet Dim workbook As Workbook = excelApp.Workbooks.Add() Dim worksheet As Worksheet = CType(workbook.ActiveSheet, Worksheet) Try ' Write column headers to the first row For i As Integer = 0 To dt.Columns.Count - 1 worksheet.Cells(1, i + 1) = dt.Columns(i).ColumnName Next ' Write data rows starting from row 2 For i As Integer = 0 To dt.Rows.Count - 1 For j As Integer = 0 To dt.Columns.Count - 1 worksheet.Cells(i + 2, j + 1) = dt.Rows(i)(j).ToString() Next Next ' Define file path and save the Excel file Dim filePath As String = "C:\Reports\EmployeeReport_Interop.xlsx" workbook.SaveAs(filePath) Console.WriteLine("Excel file created successfully using Interop.") Catch ex As Exception Console.WriteLine("Error exporting data to Excel: " & ex.Message) Finally ' Close workbook and quit Excel application workbook.Close() excelApp.Quit() ' Critical: Release COM objects to prevent memory leaks Marshal.ReleaseComObject(worksheet) Marshal.ReleaseComObject(workbook) Marshal.ReleaseComObject(excelApp) End Try $vbLabelText $csharpLabel 这段代码演示了使用 Microsoft Interop 将DataTable导出到 Excel 文件的完整工作流程。该流程首先创建一个名为dt的新DataTable其中包含员工信息——四列分别代表 ID、姓名、部门和薪资,这些都是商业应用程序中常见的数据类型。 Application对象代表 Excel 进程本身。 将Visible = false可防止 Excel 应用程序在处理过程中出现在屏幕上,这对于后台操作至关重要。 DisplayAlerts = false设置会抑制用户运行导出时可能会中断自动化工作流程的对话框。 Workbook和Worksheet对象与 Excel 的文件结构直接对应。 工作簿指的是 Excel 文件本身(.XLSX 或 .XLS 格式),而工作表则是该文件中的各个工作表标签。代码使用workbook.ActiveSheet来获取每个新工作簿创建的默认工作表的引用。 如何使用 IronXL 将数据表导出到 Excel? IronXL提供了一种无需安装 Office 即可使用的现代化替代方案。 该库可以直接读取和写入 Excel 文件,因此适用于服务器环境、云部署和跨平台应用程序。 前提条件 通过 NuGet 程序包管理器控制台安装 IronXL: Install-Package IronXL.Excel Install-Package IronXL.Excel SHELL 或使用 .NET CLI: dotnet add package IronXL.Excel dotnet add package IronXL.Excel SHELL 无需安装其他软件、Office 或进行系统配置。 该库在 Windows、Linux 和 macOS 上安装后即可立即使用。 对于 Azure 部署,IronXL 无需特殊配置即可在应用服务、函数和容器实例中运行。 该库支持 .NET Framework 4.6.2+ 和所有现代 .NET 版本,包括 .NET 6、7、8、9 和 10。 IronXL 代码示例 以下代码展示了如何使用 IronXL 库将DataTable转换为 Excel: using IronXL; using System.Data; // Create a sample DataTable DataTable dt = new DataTable("Employees"); dt.Columns.Add("EmployeeID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Department", typeof(string)); dt.Columns.Add("Salary", typeof(decimal)); // Fill DataTable with rows of data dt.Rows.Add(1, "John Smith", "Engineering", 75000); dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000); dt.Rows.Add(3, "Michael Chen", "Finance", 70000); dt.Rows.Add(4, "Emily Davis", "Engineering", 80000); // Create a new Excel workbook and worksheet WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet sheet = workbook.CreateWorkSheet("Employees"); // Write column names to the first row as headers for (int i = 0; i < dt.Columns.Count; i++) { sheet.SetCellValue(0, i, dt.Columns[i].ColumnName); } // Export DataTable rows to Excel cells for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { sheet.SetCellValue(i + 1, j, dt.Rows[i][j]); } } // Save to file path as xlsx format string filePath = @"C:\Reports\EmployeeReport_IronXL.xlsx"; workbook.SaveAs(filePath); Console.WriteLine("Excel file created successfully using IronXL."); using IronXL; using System.Data; // Create a sample DataTable DataTable dt = new DataTable("Employees"); dt.Columns.Add("EmployeeID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Department", typeof(string)); dt.Columns.Add("Salary", typeof(decimal)); // Fill DataTable with rows of data dt.Rows.Add(1, "John Smith", "Engineering", 75000); dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000); dt.Rows.Add(3, "Michael Chen", "Finance", 70000); dt.Rows.Add(4, "Emily Davis", "Engineering", 80000); // Create a new Excel workbook and worksheet WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet sheet = workbook.CreateWorkSheet("Employees"); // Write column names to the first row as headers for (int i = 0; i < dt.Columns.Count; i++) { sheet.SetCellValue(0, i, dt.Columns[i].ColumnName); } // Export DataTable rows to Excel cells for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { sheet.SetCellValue(i + 1, j, dt.Rows[i][j]); } } // Save to file path as xlsx format string filePath = @"C:\Reports\EmployeeReport_IronXL.xlsx"; workbook.SaveAs(filePath); Console.WriteLine("Excel file created successfully using IronXL."); $vbLabelText $csharpLabel IronXL 的方法遵循类似的逻辑结构,但语法更简洁,没有 COM 的复杂性。 这个 Excel 库使开发人员能够创建、读取和写入电子表格文件,而无需依赖任何 Microsoft Office。 WorkBook.Create方法以指定的格式初始化一个新的工作簿ExcelFileFormat.XLSX生成与 Excel 2007 及更高版本兼容的现代 Office Open XML 文件,同时该库还支持旧版系统的 XLS 格式。 输出 如何使用 Interop 或 IronXL 将数据表导出到 Excel(C#):图 1 - Excel 输出 如何使用 Interop 或 IronXL 将数据表导出到 Excel(C#):图 2 - 控制台输出 CreateWorkSheet方法会向工作簿中添加一个具有指定表名的新工作表。 与 Interop 先处理应用程序对象不同,IronXL 直接处理文件结构。 当用户打开 Excel 文件时,工作表名称会显示在 Excel 底部的选项卡上。 单元格填充使用SetCellValue ,该函数接受行索引、列索引和要写入的值。与 Excel Interop 的基于 1 的索引不同,IronXL 使用基于 0 的索引,符合标准的 .NET Framework 约定——第 0 行是第一行,第 0 列是第一列。 与其他 .NET 集合和DataTable列的一致性降低了认知负荷,并消除了在索引系统之间转换时经常发生的差一错误。 该方法能够自动智能地处理类型转换。 整数、字符串、十进制数和日期时间值均采用适当的 Excel 单元格格式写入。 十进制值显示为可以参与公式的数字,而日期值可以格式化为 dd/mm/yyyy 或其他区域格式。 该库能够正确处理空值和缺失数据,而不会抛出异常。 请注意,代码中完全没有清理代码。 IronXL 对象是标准的 .NET 托管对象,垃圾回收器会自动处理它们。 不存在孤立进程的风险,无需管理 COM 引用计数,也不会因不当的资源释放模式而导致内存泄漏。 仅此一项简化就消除了困扰 Excel Interop 解决方案的一整类错误。 有关 IronXL 的 Excel 创建功能的更多详细信息,请参阅创建电子表格文档。 如何创建可重用的导出方法? 生产环境中的应用通常需要一个可重用的方法,将任何DataTable导出到 Excel 文件。以下代码示例演示了一个辅助类,该类封装了导出逻辑,并可通过事件处理程序(例如按钮点击事件)调用,同时object sender参数。 可重用的 IronXL 导出助手 using IronXL; using System.Data; using System.IO; using System; public class ExcelExporter { /// <summary> /// Export a DataTable to Excel file at the specified path /// </summary> public static bool ExportToExcel(DataTable dt, string filePath) { if (dt == null || dt.Rows.Count == 0) return false; try { // Create new workbook and worksheet WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet sheet = workbook.CreateWorkSheet(dt.TableName ?? "Sheet1"); // Write column names as headers in the first row for (int i = 0; i < dt.Columns.Count; i++) { var cell = sheet.GetCellAt(0, i); cell.Value = dt.Columns[i].ColumnName; cell.Style.Font.Bold = true; } // Fill cells with data values from each row for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { var value = dt.Rows[i][j]; // Handle missing or null values if (value == DBNull.Value || value == null) sheet.SetCellValue(i + 1, j, ""); else sheet.SetCellValue(i + 1, j, value); } } // Validate file path and save FileInfo fileInfo = new FileInfo(filePath); if (!fileInfo.Directory.Exists) fileInfo.Directory.Create(); workbook.SaveAs(filePath); return true; } catch (Exception ex) { Console.WriteLine("Export failed: " + ex.Message); return false; } } /// <summary> /// Query a DataTable and export filtered results /// </summary> public static DataTable FilterAndExport(DataTable dt, string filterExpression, string filePath) { if (dt == null) return dt; // Create filtered view and export DataRow[] filteredRows = dt.Select(filterExpression); DataTable filteredTable = dt.Clone(); foreach (DataRow row in filteredRows) { filteredTable.ImportRow(row); } ExportToExcel(filteredTable, filePath); return filteredTable; } /// <summary> /// Export DataTable to CSV file as an alternative format /// </summary> public static string ExportToCsv(DataTable dt) { StringBuilder sb = new StringBuilder(); // Write column headers string[] columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName).ToArray(); sb.AppendLine(string.Join(",", columnNames)); // Write data rows foreach (DataRow row in dt.Rows) { string[] values = row.ItemArray.Select(field => field?.ToString() ?? "").ToArray(); sb.AppendLine(string.Join(",", values)); } return sb.ToString(); } } // Usage example in Windows Forms or WPF event handler public void ExportButton_Click(object sender, EventArgs e) { DataTable dt = GetEmployeeData(); // Your data source string filePath = @"C:\Reports\Export.xlsx"; bool success = ExcelExporter.ExportToExcel(dt, filePath); if (success) Console.WriteLine("Export completed successfully"); } using IronXL; using System.Data; using System.IO; using System; public class ExcelExporter { /// <summary> /// Export a DataTable to Excel file at the specified path /// </summary> public static bool ExportToExcel(DataTable dt, string filePath) { if (dt == null || dt.Rows.Count == 0) return false; try { // Create new workbook and worksheet WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet sheet = workbook.CreateWorkSheet(dt.TableName ?? "Sheet1"); // Write column names as headers in the first row for (int i = 0; i < dt.Columns.Count; i++) { var cell = sheet.GetCellAt(0, i); cell.Value = dt.Columns[i].ColumnName; cell.Style.Font.Bold = true; } // Fill cells with data values from each row for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { var value = dt.Rows[i][j]; // Handle missing or null values if (value == DBNull.Value || value == null) sheet.SetCellValue(i + 1, j, ""); else sheet.SetCellValue(i + 1, j, value); } } // Validate file path and save FileInfo fileInfo = new FileInfo(filePath); if (!fileInfo.Directory.Exists) fileInfo.Directory.Create(); workbook.SaveAs(filePath); return true; } catch (Exception ex) { Console.WriteLine("Export failed: " + ex.Message); return false; } } /// <summary> /// Query a DataTable and export filtered results /// </summary> public static DataTable FilterAndExport(DataTable dt, string filterExpression, string filePath) { if (dt == null) return dt; // Create filtered view and export DataRow[] filteredRows = dt.Select(filterExpression); DataTable filteredTable = dt.Clone(); foreach (DataRow row in filteredRows) { filteredTable.ImportRow(row); } ExportToExcel(filteredTable, filePath); return filteredTable; } /// <summary> /// Export DataTable to CSV file as an alternative format /// </summary> public static string ExportToCsv(DataTable dt) { StringBuilder sb = new StringBuilder(); // Write column headers string[] columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName).ToArray(); sb.AppendLine(string.Join(",", columnNames)); // Write data rows foreach (DataRow row in dt.Rows) { string[] values = row.ItemArray.Select(field => field?.ToString() ?? "").ToArray(); sb.AppendLine(string.Join(",", values)); } return sb.ToString(); } } // Usage example in Windows Forms or WPF event handler public void ExportButton_Click(object sender, EventArgs e) { DataTable dt = GetEmployeeData(); // Your data source string filePath = @"C:\Reports\Export.xlsx"; bool success = ExcelExporter.ExportToExcel(dt, filePath); if (success) Console.WriteLine("Export completed successfully"); } Imports IronXL Imports System.Data Imports System.IO Imports System Public Class ExcelExporter ''' <summary> ''' Export a DataTable to Excel file at the specified path ''' </summary> Public Shared Function ExportToExcel(dt As DataTable, filePath As String) As Boolean If dt Is Nothing OrElse dt.Rows.Count = 0 Then Return False Try ' Create new workbook and worksheet Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX) Dim sheet As WorkSheet = workbook.CreateWorkSheet(If(dt.TableName, "Sheet1")) ' Write column names as headers in the first row For i As Integer = 0 To dt.Columns.Count - 1 Dim cell = sheet.GetCellAt(0, i) cell.Value = dt.Columns(i).ColumnName cell.Style.Font.Bold = True Next ' Fill cells with data values from each row For i As Integer = 0 To dt.Rows.Count - 1 For j As Integer = 0 To dt.Columns.Count - 1 Dim value = dt.Rows(i)(j) ' Handle missing or null values If value Is DBNull.Value OrElse value Is Nothing Then sheet.SetCellValue(i + 1, j, "") Else sheet.SetCellValue(i + 1, j, value) End If Next Next ' Validate file path and save Dim fileInfo As New FileInfo(filePath) If Not fileInfo.Directory.Exists Then fileInfo.Directory.Create() workbook.SaveAs(filePath) Return True Catch ex As Exception Console.WriteLine("Export failed: " & ex.Message) Return False End Try End Function ''' <summary> ''' Query a DataTable and export filtered results ''' </summary> Public Shared Function FilterAndExport(dt As DataTable, filterExpression As String, filePath As String) As DataTable If dt Is Nothing Then Return dt ' Create filtered view and export Dim filteredRows As DataRow() = dt.Select(filterExpression) Dim filteredTable As DataTable = dt.Clone() For Each row As DataRow In filteredRows filteredTable.ImportRow(row) Next ExportToExcel(filteredTable, filePath) Return filteredTable End Function ''' <summary> ''' Export DataTable to CSV file as an alternative format ''' </summary> Public Shared Function ExportToCsv(dt As DataTable) As String Dim sb As New StringBuilder() ' Write column headers Dim columnNames As String() = dt.Columns.Cast(Of DataColumn)().Select(Function(column) column.ColumnName).ToArray() sb.AppendLine(String.Join(",", columnNames)) ' Write data rows For Each row As DataRow In dt.Rows Dim values As String() = row.ItemArray.Select(Function(field) If(field?.ToString(), "")).ToArray() sb.AppendLine(String.Join(",", values)) Next Return sb.ToString() End Function End Class ' Usage example in Windows Forms or WPF event handler Public Sub ExportButton_Click(sender As Object, e As EventArgs) Dim dt As DataTable = GetEmployeeData() ' Your data source Dim filePath As String = "C:\Reports\Export.xlsx" Dim success As Boolean = ExcelExporter.ExportToExcel(dt, filePath) If success Then Console.WriteLine("Export completed successfully") End Sub $vbLabelText $csharpLabel 这个辅助类演示了几个可用于生产环境的模式。 ExportToExcel方法接受任何DataTable和文件路径字符串,如果导出失败或表格为空,则返回 false。 该方法通过在写入单元格之前检查DBNull.Value来优雅地处理缺失值。 FilterAndExport方法展示了如何在导出之前使用筛选表达式查询DataTable当用户只需要导出特定记录时非常有用。 该方法返回已过滤的DataTable ,以便调用代码可以对其进行进一步处理。 ExportToCsv方法使用StringBuilder高效地构建 CSV 输出,作为 Excel 格式的替代方案。 虽然 IronXL 本身支持 CSV 导出,但本示例为了教学目的展示了手动导出方法。 事件处理程序示例展示了这些方法如何与 Windows Forms 或 WPF 应用程序集成,其中object sender和EventArgs是标准参数。 一些熟悉 ClosedXML 的开发人员可能会使用new XLWorkbook()识别出类似的模式,但 IronXL 的 API 提供了等效的功能以及额外的格式支持。 这两种方法如何处理单元格格式? 专业的 Excel 导出文件通常需要进行格式设置:粗体标题、彩色单元格、边框和数字格式。 这两个库都支持样式,但实现方式截然不同。 使用 Interop 进行格式化 using Microsoft.Office.Interop.Excel; using System.Data; using System.Runtime.InteropServices; DataTable dt = new DataTable("Sales"); dt.Columns.Add("Product", typeof(string)); dt.Columns.Add("Revenue", typeof(decimal)); dt.Rows.Add("Widget A", 15000.50m); dt.Rows.Add("Widget B", 22500.75m); Application excelApp = new Application(); Workbook workbook = excelApp.Workbooks.Add(); Worksheet worksheet = (Worksheet)workbook.ActiveSheet; // Write column headers with formatting to first row for (int i = 0; i < dt.Columns.Count; i++) { Range headerCell = worksheet.Cells[1, i + 1]; headerCell.Value = dt.Columns[i].ColumnName; headerCell.Font.Bold = true; headerCell.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue); headerCell.Borders.LineStyle = XlLineStyle.xlContinuous; } // Write data values to cells for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j]; } } string filePath = @"C:\Reports\FormattedReport_Interop.xlsx"; workbook.SaveAs(filePath); workbook.Close(); excelApp.Quit(); Marshal.ReleaseComObject(worksheet); Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(excelApp); using Microsoft.Office.Interop.Excel; using System.Data; using System.Runtime.InteropServices; DataTable dt = new DataTable("Sales"); dt.Columns.Add("Product", typeof(string)); dt.Columns.Add("Revenue", typeof(decimal)); dt.Rows.Add("Widget A", 15000.50m); dt.Rows.Add("Widget B", 22500.75m); Application excelApp = new Application(); Workbook workbook = excelApp.Workbooks.Add(); Worksheet worksheet = (Worksheet)workbook.ActiveSheet; // Write column headers with formatting to first row for (int i = 0; i < dt.Columns.Count; i++) { Range headerCell = worksheet.Cells[1, i + 1]; headerCell.Value = dt.Columns[i].ColumnName; headerCell.Font.Bold = true; headerCell.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue); headerCell.Borders.LineStyle = XlLineStyle.xlContinuous; } // Write data values to cells for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j]; } } string filePath = @"C:\Reports\FormattedReport_Interop.xlsx"; workbook.SaveAs(filePath); workbook.Close(); excelApp.Quit(); Marshal.ReleaseComObject(worksheet); Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(excelApp); Imports Microsoft.Office.Interop.Excel Imports System.Data Imports System.Runtime.InteropServices Dim dt As New DataTable("Sales") dt.Columns.Add("Product", GetType(String)) dt.Columns.Add("Revenue", GetType(Decimal)) dt.Rows.Add("Widget A", 15000.5D) dt.Rows.Add("Widget B", 22500.75D) Dim excelApp As New Application() Dim workbook As Workbook = excelApp.Workbooks.Add() Dim worksheet As Worksheet = CType(workbook.ActiveSheet, Worksheet) ' Write column headers with formatting to first row For i As Integer = 0 To dt.Columns.Count - 1 Dim headerCell As Range = worksheet.Cells(1, i + 1) headerCell.Value = dt.Columns(i).ColumnName headerCell.Font.Bold = True headerCell.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue) headerCell.Borders.LineStyle = XlLineStyle.xlContinuous Next ' Write data values to cells For i As Integer = 0 To dt.Rows.Count - 1 For j As Integer = 0 To dt.Columns.Count - 1 worksheet.Cells(i + 2, j + 1) = dt.Rows(i)(j) Next Next Dim filePath As String = "C:\Reports\FormattedReport_Interop.xlsx" workbook.SaveAs(filePath) workbook.Close() excelApp.Quit() Marshal.ReleaseComObject(worksheet) Marshal.ReleaseComObject(workbook) Marshal.ReleaseComObject(excelApp) $vbLabelText $csharpLabel Interop 格式化代码访问各个Range对象并设置Font.Bold 、 Interior.Color和Borders.LineStyle等属性。 每次属性访问都是一次 COM 进程间调用,这会增加开销,并且如果 Excel 无响应,则会增加出现异常的几率。 使用 IronXL 进行格式化 using IronXL; using IronXL.Styles; using System.Data; DataTable dt = new DataTable("Sales"); dt.Columns.Add("Product", typeof(string)); dt.Columns.Add("Revenue", typeof(decimal)); dt.Rows.Add("Widget A", 15000.50m); dt.Rows.Add("Widget B", 22500.75m); WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet sheet = workbook.CreateWorkSheet("Sales"); // Write column headers with formatting to first row for (int i = 0; i < dt.Columns.Count; i++) { sheet.SetCellValue(0, i, dt.Columns[i].ColumnName); var cell = sheet.GetCellAt(0, i); cell.Value = dt.Columns[i].ColumnName; cell.Style.Font.Bold = true; cell.Style.SetBackgroundColor("#ADD8E6"); cell.Style.BottomBorder.SetColor("#000000"); cell.Style.BottomBorder.Type = BorderType.Thin; } // Write data rows with values from DataTable for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { sheet.SetCellValue(i + 1, j, dt.Rows[i][j]); } } string filePath = @"C:\Reports\FormattedReport_IronXL.xlsx"; workbook.SaveAs(filePath); using IronXL; using IronXL.Styles; using System.Data; DataTable dt = new DataTable("Sales"); dt.Columns.Add("Product", typeof(string)); dt.Columns.Add("Revenue", typeof(decimal)); dt.Rows.Add("Widget A", 15000.50m); dt.Rows.Add("Widget B", 22500.75m); WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet sheet = workbook.CreateWorkSheet("Sales"); // Write column headers with formatting to first row for (int i = 0; i < dt.Columns.Count; i++) { sheet.SetCellValue(0, i, dt.Columns[i].ColumnName); var cell = sheet.GetCellAt(0, i); cell.Value = dt.Columns[i].ColumnName; cell.Style.Font.Bold = true; cell.Style.SetBackgroundColor("#ADD8E6"); cell.Style.BottomBorder.SetColor("#000000"); cell.Style.BottomBorder.Type = BorderType.Thin; } // Write data rows with values from DataTable for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { sheet.SetCellValue(i + 1, j, dt.Rows[i][j]); } } string filePath = @"C:\Reports\FormattedReport_IronXL.xlsx"; workbook.SaveAs(filePath); Imports IronXL Imports IronXL.Styles Imports System.Data Dim dt As New DataTable("Sales") dt.Columns.Add("Product", GetType(String)) dt.Columns.Add("Revenue", GetType(Decimal)) dt.Rows.Add("Widget A", 15000.5D) dt.Rows.Add("Widget B", 22500.75D) Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX) Dim sheet As WorkSheet = workbook.CreateWorkSheet("Sales") ' Write column headers with formatting to first row For i As Integer = 0 To dt.Columns.Count - 1 sheet.SetCellValue(0, i, dt.Columns(i).ColumnName) Dim cell = sheet.GetCellAt(0, i) cell.Value = dt.Columns(i).ColumnName cell.Style.Font.Bold = True cell.Style.SetBackgroundColor("#ADD8E6") cell.Style.BottomBorder.SetColor("#000000") cell.Style.BottomBorder.Type = BorderType.Thin Next ' Write data rows with values from DataTable For i As Integer = 0 To dt.Rows.Count - 1 For j As Integer = 0 To dt.Columns.Count - 1 sheet.SetCellValue(i + 1, j, dt.Rows(i)(j)) Next Next Dim filePath As String = "C:\Reports\FormattedReport_IronXL.xlsx" workbook.SaveAs(filePath) $vbLabelText $csharpLabel IronXL 的样式 API 使用流畅、直观的语法,.NET 开发人员会发现这种语法非常熟悉。 Style属性通过简洁的对象模型提供对字体设置、背景颜色和边框的访问。 颜色值接受标准十六进制代码,例如#ADD8E6 (浅蓝色),无需在颜色系统之间转换即可轻松匹配企业品牌或设计规范。 输出 如何使用 Interop 或 IronXL 将数据表导出到 Excel C#:图 3 - 使用 IronXL 输出格式 单元格访问器语法sheet[row, col]可以直接访问单个单元格,而无需创建其他对象或范围引用。 这种方法可以减少代码冗余,并省去基于 COM 的 API 所需的繁琐步骤。在同一单元格上设置多个样式属性非常简单——每个属性赋值都会直接修改单元格的外观。 边框配置体现了 IronXL 的实用设计。 开发者无需处理需要查阅文档的枚举值,而是使用BorderType.Thin表示标准边框,或使用BorderType.Thick表示强调的边界。 SetColor方法接受十六进制颜色代码作为边框颜色,以保持与背景颜色规范的一致性。 要了解包括数字格式、条件格式和高级样式技巧在内的全面格式设置选项,请查阅单元格样式文档和边框对齐指南。 出口最佳实践 为确保数据顺利可靠地导出到 Excel,在整个开发过程中遵循最佳实践至关重要。 始终对导出的 Excel 文件使用一致的文件路径和命名规则,使文件管理变得简单明了且可预测。 通过捕获异常(例如使用catch (Exception ex)来实现强大的错误处理,如果在导出过程中发生错误,则返回 false 或提供有意义的反馈。 对于大型数据集,可以考虑使用 OpenXML SDK,它提供了一种高性能、内存效率高的方式将数据写入 Excel 文件,而无需自动化 Microsoft Excel 的额外开销。 像 ClosedXML 这样的库进一步简化了导出过程,提供了直观的 API,有助于确保您的代码高效运行且易于维护。 通过遵循这些最佳实践,开发人员可以创建既可靠又可扩展的导出例程,无论数据集的大小或复杂性如何,都能将准确的数据导出到 Excel 文件。 何时应该选择哪种方法? 当您需要将 DataTable 数据导出到 Excel 文件时,正确的选择取决于项目的具体要求、部署环境以及长期维护方面的考虑。 在以下情况下选择 Microsoft Office Excel Interop: 处理已安装 Office 并依赖 Interop 的旧系统 需要使用高级 Excel 功能,例如宏、数据透视表或图表自动化,这些功能需要完整的 Excel 应用程序对象模型。 构建桌面应用程序,用户需要安装 Microsoft Excel,并且该应用程序可以交互式运行。 部署环境完全受控,仅限 Windows 系统,Office 许可证已准备就绪。 自动化包含复杂嵌入式公式或 VBA 代码的现有 Excel 模板 选择 IronXL 的情况: 构建用于生成 Excel 文件导出的 Web 应用程序、REST API 或后台服务 部署到云环境,例如 Azure 应用服务、AWS Lambda 或 Docker 容器 需要对 Windows、Linux 或 macOS 部署提供跨平台支持 适用于 .NET Framework 4.6.2+ 或更高版本,但互操作支持有限。 需要可靠、可预测的资源管理,且无需担心 COM 清理问题。 避免生产服务器上的 Office 许可依赖 构建多租户应用程序,其中独立生成 Excel 文件至关重要 高效处理大型数据集,无需 COM 进程间通信的开销 需要导出为多种格式,包括 XLSX、XLS、CSV 文件、JSON 和 XML。 IronXL 教程提供了更多示例,涵盖常见场景,包括读取现有 Excel 文件、使用公式和管理多个工作表。 当需要将多个相关表导出到不同的工作表时,该库还支持使用 DataSet 对象。 结论 将 DataTable 导出到 Excel 文件是处理业务数据的 .NET 应用程序的基本要求。 无论您是需要从数据库查询导出数据、从数据集创建报告,还是将数据表列转换为格式化的 Excel 表格,选择合适的库都至关重要。 虽然 Microsoft Office Excel Interop 多年来一直为开发人员提供服务,但它对 Office 安装的依赖性、COM 的复杂性、不受支持的服务器场景以及资源管理方面的挑战,使其对于现代应用程序开发而言越来越不切实际。 诸如catch (Exception ex)块中填充 COM 清理代码以及缺失引用的变通方法等问题是常见的痛点。 IronXL 提供了一种更清洁、更可靠的替代方案,直接解决了这些局限性。 通过 NuGet 进行简单的Install-Package ,支持 Windows、Linux 和 macOS 等跨平台,以及遵循 .NET Framework 约定的简单 API,它消除了困扰 Excel Interop 解决方案的部署难题和资源管理陷阱。 本文中的代码示例表明,完成相同的 DataTable 到 Excel 导出任务需要类似的开发工作量,但 IronXL 可以在不增加运营开销和维护负担的情况下提供结果。 准备好简化 .NET 项目中的 Excel 文件生成流程了吗? 立即开始 IronXL 的免费试用,体验它给您的开发工作流程带来的改变。 对于生产部署和团队许可,请探索符合您组织需求的许可选项。 常见问题解答 与 Excel Interop 相比,使用 IronXL 在 C# 中导出 DataTables 的主要优势是什么? IronXL 提供了一种更简单、更高效的方法,可在 C# 中将 DataTables 导出到 Excel,而无需在服务器上安装 Excel。 IronXL.Excel 能否在导出到 Excel 时处理大型 DataTable? 是的,IronXL.Excel 经过性能优化,可以处理大型 DataTables,确保快速可靠地导出到 Excel 文件。 使用 IronXL.Excel 导出数据需要安装 Microsoft Excel 吗? 不,IronXL.Excel 不需要安装 Microsoft Excel,因此非常适合服务器端应用。 与 Interop 相比,IronXL 如何简化导出 DataTables 的过程? IronXL 消除了与 Interop 相关的复杂设置和依赖性,为导出 DataTables 提供了直接的 API,从而简化了流程。 IronXL 是否与 .NET core 兼容,可将 DataTables 导出到 Excel? 是的,IronXL 与 .NET Core 完全兼容,允许您在跨平台应用程序中将 DataTables 导出到 Excel。 IronXL 可以将 DataTables 输出为哪些文件格式? IronXL 可以将 DataTables 导出为各种 Excel 文件格式,包括 XLSX、XLS 和 CSV。 IronXL 是否支持 Excel 表单的样式和格式化? 是的,IronXL.Excel 支持高级样式和格式化选项,使您能够从 DataTables 创建精美的 Excel 表单。 我可以用 IronXL 在 C# 中自动执行 Excel 相关任务吗? 是的,IronXL.Excel 可用于自动执行各种 Excel 相关任务,从导出 DataTables 到复杂的数据分析操作。 刚接触 IronXL 的开发人员是否需要学习? IronXL 的设计直观易学,提供大量的文档和示例,帮助开发人员快速入门。 在商业项目中使用 IronXL 有哪些许可选项? IronXL 提供各种许可选项,以满足不同的项目需求,包括用于商业用途的永久许可和订阅许可。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布2026年2月15日 如何使用 OleDb 与 IronXL.Excel 将 DataTable 导出到 Excel C# 了解如何使用 OleDb 与 IronXL.Excel 将 DataTable 导出到 Excel C#。 阅读更多 已发布2026年2月15日 如何使用 IronXL for .NET 在未安装 Office 的情况下在 VB.NET 中打开现有 Excel 文件 了解如何使用 IronXL for .NET 在未安装 Office 的情况下在 VB.NET 中打开现有 Excel 文件。 阅读更多 已发布2026年2月15日 C# CSV 到 XLSX:完整的开发人员指南 使用 IronXL 在 C# 中将 CSV 转换为 XLSX。加载 CSV 文件、保留数据类型、添加图表并导出为 Excel 格式,而无需依赖 Microsoft Office。 阅读更多 如何将数据集导出到 Excel VB .NET:使用 IronXL 的完整指南使用 IronXL 将 C# 保存为 CSV
已发布2026年2月15日 如何使用 OleDb 与 IronXL.Excel 将 DataTable 导出到 Excel C# 了解如何使用 OleDb 与 IronXL.Excel 将 DataTable 导出到 Excel C#。 阅读更多
已发布2026年2月15日 如何使用 IronXL for .NET 在未安装 Office 的情况下在 VB.NET 中打开现有 Excel 文件 了解如何使用 IronXL for .NET 在未安装 Office 的情况下在 VB.NET 中打开现有 Excel 文件。 阅读更多
已发布2026年2月15日 C# CSV 到 XLSX:完整的开发人员指南 使用 IronXL 在 C# 中将 CSV 转换为 XLSX。加载 CSV 文件、保留数据类型、添加图表并导出为 Excel 格式,而无需依赖 Microsoft Office。 阅读更多