使用 IRONXL 使用 C# 导出 Excel 数据表 | 转换 Excel 数据 Curtis Chau 已更新:2026年2月27日 下载 IronXL NuGet 下载 DLL 下载 免费试用 LLM副本 LLM副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 将Excel数据导出到DataTable可以让您以结构化的方式在内存中访问电子表格内容,这与数据库、UI控件和LINQ查询自然配合。 反向操作——将DataTable写回到Excel文件中——对于报告生成和数据存储工作流同样重要。 IronXL在纯.NET中处理这两个方向,无需依赖Microsoft Office,也不需要COM互操作设置。 在运行下面的任何示例之前,安装IronXL: Install-Package IronXL dotnet add package IronXL Install-Package IronXL dotnet add package IronXL SHELL 安装后,ToDataSet方法。 您还可以通过将DataRow值写回工作表,并以XLSX或XLS格式保存文件来逆转此过程。 如何将整个工作表转换为DataTable? System.Data.DataTable。 传递true以将第一行视为列标题,以便生成的表的列名与您的电子表格标题完全匹配。 using IronXL; using System.Data; // Load the workbook from disk WorkBook workbook = WorkBook.Load("customers.xlsx"); // Grab the default (first) worksheet WorkSheet worksheet = workbook.DefaultWorkSheet; // Convert the entire sheet; first row becomes column headers DataTable dataTable = worksheet.ToDataTable(true); // Iterate every row and print each cell value foreach (DataRow row in dataTable.Rows) { for (int i = 0; i < dataTable.Columns.Count; i++) { Console.Write(row[i] + "\t"); } Console.WriteLine(); } using IronXL; using System.Data; // Load the workbook from disk WorkBook workbook = WorkBook.Load("customers.xlsx"); // Grab the default (first) worksheet WorkSheet worksheet = workbook.DefaultWorkSheet; // Convert the entire sheet; first row becomes column headers DataTable dataTable = worksheet.ToDataTable(true); // Iterate every row and print each cell value foreach (DataRow row in dataTable.Rows) { for (int i = 0; i < dataTable.Columns.Count; i++) { Console.Write(row[i] + "\t"); } Console.WriteLine(); } $vbLabelText $csharpLabel 代码的作用 WorkBook.Load在没有任何Office自动化的情况下读取XLSX文件。 DataRow。 生成的SqlBulkCopy,或立即对其运行LINQ查询。 ToDataTable调用支持XLS和XLSX格式,因此相同的代码可用于旧版电子表格而无需修改。 请参阅IronXL DataTable和DataSet文档以获取完整的API参考。 如何将特定的单元格范围导出到DataTable? 当工作表包含多个数据区域,或者您只需要某些行和列的子集时,您可以导出特定的单元格范围,而不是整个工作表。 对于大文件,这种方法更为高效,因为IronXL只处理所选单元格。 using IronXL; using System.Data; WorkBook workbook = WorkBook.Load("financial_report.xlsx"); // Access a named worksheet WorkSheet worksheet = workbook.GetWorkSheet("Summary"); // Select only the region A1:D20 and convert it DataTable dt = worksheet["A1:D20"].ToDataTable(true); Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}"); foreach (DataRow row in dt.Rows) { foreach (var item in row.ItemArray) { Console.Write(item + "\t"); } Console.WriteLine(); } using IronXL; using System.Data; WorkBook workbook = WorkBook.Load("financial_report.xlsx"); // Access a named worksheet WorkSheet worksheet = workbook.GetWorkSheet("Summary"); // Select only the region A1:D20 and convert it DataTable dt = worksheet["A1:D20"].ToDataTable(true); Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}"); foreach (DataRow row in dt.Rows) { foreach (var item in row.ItemArray) { Console.Write(item + "\t"); } Console.WriteLine(); } $vbLabelText $csharpLabel 范围选择的重要性 括号语法IronXl.Range对象。 对该范围调用ToDataTable将处理限制在这些单元格上,这意味着在源文件拥有数以万计的行时,执行速度更快且内存占用更小。 您还可以指定命名范围,或在运行时动态构建范围字符串——例如$"A1:D{lastRow}"——使得这种方法对可变长度的数据导出灵活。 Range类API参考记录了所有可用的选择和查询方法。 如何将多表工作簿转换为DataSet? 多个工作表的工作簿自然映射到DataTable。 ToDataSet方法在一次调用中执行此转换。 using IronXL; using System.Data; WorkBook workbook = WorkBook.Load("multi_sheet.xlsx"); // Each worksheet becomes a DataTable inside the DataSet DataSet dataSet = workbook.ToDataSet(); foreach (DataTable table in dataSet.Tables) { Console.WriteLine($"Sheet: {table.TableName}"); Console.WriteLine($"Rows: {table.Rows.Count}"); Console.WriteLine(); } using IronXL; using System.Data; WorkBook workbook = WorkBook.Load("multi_sheet.xlsx"); // Each worksheet becomes a DataTable inside the DataSet DataSet dataSet = workbook.ToDataSet(); foreach (DataTable table in dataSet.Tables) { Console.WriteLine($"Sheet: {table.TableName}"); Console.WriteLine($"Rows: {table.Rows.Count}"); Console.WriteLine(); } $vbLabelText $csharpLabel 按名称访问工作表 返回的dataSet.Tables["Summary"]检索特定工作表,而不是迭代集合。 这使得构建多表报告逻辑或在将结果写入数据库之前组合多个工作表的数据变得简单易行。 要了解更多关于如何处理多个工作表和导航工作簿结构的方法,请参见如何打开和管理Excel工作表。 如何将DataTable导出回Excel文件? 导入到DataTable的方向只是故事的一半。 当您需要将结构化数据写回作为电子表格——用于报告、下载或归档时——您创建一个新的工作簿,从DataTable填充单元格并保存。 using IronXL; using System.Data; // Build a sample DataTable DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ProductID", typeof(int))); dt.Columns.Add(new DataColumn("ProductName", typeof(string))); dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal))); dt.Rows.Add(1, "Widget Pro", 29.99m); dt.Rows.Add(2, "Gadget Max", 49.99m); dt.Rows.Add(3, "Sensor Kit", 14.50m); // Create a new workbook and worksheet WorkBook workbook = WorkBook.Create(); WorkSheet worksheet = workbook.CreateWorkSheet("Products"); // Write column headers from DataTable.Columns for (int col = 0; col < dt.Columns.Count; col++) { worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName); } // Write data rows for (int row = 0; row < dt.Rows.Count; row++) { for (int col = 0; col < dt.Columns.Count; col++) { worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]); } } // Save as XLSX workbook.SaveAs("products_export.xlsx"); Console.WriteLine("Export complete."); using IronXL; using System.Data; // Build a sample DataTable DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ProductID", typeof(int))); dt.Columns.Add(new DataColumn("ProductName", typeof(string))); dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal))); dt.Rows.Add(1, "Widget Pro", 29.99m); dt.Rows.Add(2, "Gadget Max", 49.99m); dt.Rows.Add(3, "Sensor Kit", 14.50m); // Create a new workbook and worksheet WorkBook workbook = WorkBook.Create(); WorkSheet worksheet = workbook.CreateWorkSheet("Products"); // Write column headers from DataTable.Columns for (int col = 0; col < dt.Columns.Count; col++) { worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName); } // Write data rows for (int row = 0; row < dt.Rows.Count; row++) { for (int col = 0; col < dt.Columns.Count; col++) { worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]); } } // Save as XLSX workbook.SaveAs("products_export.xlsx"); Console.WriteLine("Export complete."); $vbLabelText $csharpLabel 单元写入循环的工作方式 object值,因此您可以传递列名称用于标题行,传递原始单元格值用于数据行,而无需任何类型转换。 row + 1的行偏移为标题保留了第0行。 生成的XLSX文件是一个完全有效的电子表格——没有占位符,没有临时文件。 对于较大的DataTable,考虑在写入数据后应用 自动调整行列大小,以便内容显示整洁而无需手动格式化。 如何将DataTable绑定到DataGridView? 将Excel表格导出到DataTable的最常见原因之一是将其显示在Windows Forms DataGridView中。 一旦有了DataTable,绑定只是一个代码行。 using IronXL; using System.Data; using System.Windows.Forms; WorkBook workbook = WorkBook.Load("inventory.xlsx"); WorkSheet worksheet = workbook.DefaultWorkSheet; DataTable dataTable = worksheet.ToDataTable(true); // Bind directly to a DataGridView dataGridViewInventory.DataSource = dataTable; using IronXL; using System.Data; using System.Windows.Forms; WorkBook workbook = WorkBook.Load("inventory.xlsx"); WorkSheet worksheet = workbook.DefaultWorkSheet; DataTable dataTable = worksheet.ToDataTable(true); // Bind directly to a DataGridView dataGridViewInventory.DataSource = dataTable; $vbLabelText $csharpLabel 绑定时发生了什么 设置DataTable中读取列名称和行数据。 每个DataRow成为可见行。 您可以通过网格的内置控件应用排序、过滤和选择行为,而无需任何额外代码。 这种模式同样适用于WPF DataGrid、ASP.NET GridView以及任何其他.NET数据绑定基础设施。 欲获得分步指南,请参见如何将DataGridView导出到Excel以了解反方向。 如何对导出的DataTable使用LINQ查询? 在将工作表转换为DataRow转化为可查询元素。 using IronXL; using System.Data; using System.Linq; WorkBook workbook = WorkBook.Load("sales.xlsx"); DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true); // Filter rows where the "Revenue" column exceeds 10000 var highRevenue = dt.AsEnumerable() .Where(row => row.Field<double>("Revenue") > 10000) .OrderByDescending(row => row.Field<double>("Revenue")) .ToList(); Console.WriteLine($"High-revenue records: {highRevenue.Count}"); foreach (var row in highRevenue) { Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}"); } using IronXL; using System.Data; using System.Linq; WorkBook workbook = WorkBook.Load("sales.xlsx"); DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true); // Filter rows where the "Revenue" column exceeds 10000 var highRevenue = dt.AsEnumerable() .Where(row => row.Field<double>("Revenue") > 10000) .OrderByDescending(row => row.Field<double>("Revenue")) .ToList(); Console.WriteLine($"High-revenue records: {highRevenue.Count}"); foreach (var row in highRevenue) { Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}"); } $vbLabelText $csharpLabel DataTable上使用LINQ的好处 LINQ查询为您提供了一种可读性强、类型安全的方式来过滤、排序、分组和投影来自转换后工作表的数据。 InvalidCastException。 这使得更容易在早期捕捉数据质量问题。 将此方法与早期章节中的基于范围的导出结合使用,以查询特定工作表区域而不是整个工作表,从而在处理大文件时保持低内存使用。 如何在导出过程中处理空值和空白单元格? Excel电子表格经常有间隙——空白单元格、合并区域或占位符文本。 IronXL将空白单元格映射到导出的DBNull.Value,匹配标准ADO.NET行为,因此您现有的空值处理代码可以不经修改地工作。 IronXL如何将Excel单元格状态映射为DataTable值 Excel单元格状态 DataTable值 注意事项 文本值 字符串 按原样返回 数值 Double或Decimal 依赖于单元格格式 日期值 DateTime 从序列号解析 布尔值 布尔 Excel中的TRUE/FALSE 空白单元格 DBNull.Value 标准ADO.NET空值 公式单元格 计算结果 IronXL首先计算公式 当将DBNull.Value字段生成空白单元格,保留往返的一致性。 如果您需要一个默认的字符串来表示空字段,请在调用DBNull.Value。 有关进一步的数据准备指导,Microsoft的DataTable类文档涵盖空值处理、约束管理和行状态的详细信息。 如何在导出大型工作表时节省内存? 对于有数千行的工作表,一次性导出整个表会同时在内存中分配所有数据。 两种IronXL模式可以减少峰值内存使用: 范围导出:使用worksheet["A1:D5000"].ToDataTable(true)处理有界区域而不是整个工作表。 批处理:用worksheet.RowCount计算最后使用的行,然后循环固定大小的范围——例如每次1000行——在移动到下一批之前处理每个批次。 worksheet.ColumnCount属性让您可以在不硬编码尺寸的情况下构建动态范围字符串: using IronXL; using System.Data; WorkBook workbook = WorkBook.Load("large_dataset.xlsx"); WorkSheet worksheet = workbook.DefaultWorkSheet; int batchSize = 1000; int totalRows = worksheet.RowCount; for (int startRow = 1; startRow <= totalRows; startRow += batchSize) { int endRow = Math.Min(startRow + batchSize - 1, totalRows); string rangeAddress = $"A{startRow}:Z{endRow}"; DataTable batch = worksheet[rangeAddress].ToDataTable(false); // Process each batch -- write to database, transform, etc. Console.WriteLine($"Processed rows {startRow} to {endRow}"); } using IronXL; using System.Data; WorkBook workbook = WorkBook.Load("large_dataset.xlsx"); WorkSheet worksheet = workbook.DefaultWorkSheet; int batchSize = 1000; int totalRows = worksheet.RowCount; for (int startRow = 1; startRow <= totalRows; startRow += batchSize) { int endRow = Math.Min(startRow + batchSize - 1, totalRows); string rangeAddress = $"A{startRow}:Z{endRow}"; DataTable batch = worksheet[rangeAddress].ToDataTable(false); // Process each batch -- write to database, transform, etc. Console.WriteLine($"Processed rows {startRow} to {endRow}"); } $vbLabelText $csharpLabel 这种模式特别适用于在C#中读取大型Excel文件时适用的内存约束。 如何将DataTable写入数据库? 一旦有了SqlBulkCopy插入到SQL Server是大数据集的最快路径。 INSERT语句的情况下按批次流式传输行。 using IronXL; using System.Data; using Microsoft.Data.SqlClient; WorkBook workbook = WorkBook.Load("orders.xlsx"); DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true); string connection字符串 = "Server=.;Database=OrdersDB;Trusted_Connection=True;"; using SqlConnection connection = new(connection字符串); connection.Open(); using SqlBulkCopy bulkCopy = new(connection); bulkCopy.DestinationTableName = "dbo.Orders"; bulkCopy.BatchSize = 500; bulkCopy.BulkCopyTimeout = 60; // Map DataTable columns to database columns bulkCopy.ColumnMappings.Add("OrderID", "OrderID"); bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName"); bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount"); bulkCopy.WriteToServer(dataTable); Console.WriteLine("Bulk insert complete."); using IronXL; using System.Data; using Microsoft.Data.SqlClient; WorkBook workbook = WorkBook.Load("orders.xlsx"); DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true); string connection字符串 = "Server=.;Database=OrdersDB;Trusted_Connection=True;"; using SqlConnection connection = new(connection字符串); connection.Open(); using SqlBulkCopy bulkCopy = new(connection); bulkCopy.DestinationTableName = "dbo.Orders"; bulkCopy.BatchSize = 500; bulkCopy.BulkCopyTimeout = 60; // Map DataTable columns to database columns bulkCopy.ColumnMappings.Add("OrderID", "OrderID"); bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName"); bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount"); bulkCopy.WriteToServer(dataTable); Console.WriteLine("Bulk insert complete."); $vbLabelText $csharpLabel 列映射考虑因素 DataTable列名与数据库列名匹配。 如果两个名称相同,您可以省略单个映射,SqlBulkCopy会自动按名称匹配。 当电子表格列顺序与数据库模式不同步时,显式映射更安全。 有关将IronXL与数据库工作流结合使用的更多信息,C# Excel导入指南涵盖了更多导入场景,包括插入前的验证。 对于基于Entity Framework的项目,首先将您的DataTable行转换为类型化模型对象,然后使用像EFCore.BulkExtensions这样的库从事ORM感知批量插入。 Microsoft的SqlBulkCopy文档详细解释了批处理选项和事务支持。 接下来您的步骤是什么? 现在您有了一个完整的工具包,可以使用IronXL在Excel和DataTable之间的两个方向移动数据: 使用worksheet.ToDataTable(true)转换完整工作表进行标题感知导出 使用worksheet["A1:D20"].ToDataTable(true)语法导出特定单元格范围 使用DataSet访问 通过DataTable内容写回XLSX 用单个DataGridView之类的UI控件 从SqlBulkCopy以进行高吞吐量的数据库插入 为了加深您的IronXL技能,请探索这些相关主题: 导出DataSet和DataTable——完整API参考 在C#中将Excel转换为DataTable,无需OleDb C# DataTable导出到Excel教程 从ASP.NET导出DataTable到Excel 最快的方式将DataTable导出到Excel 在C#中加载和读取Excel文件 导出Excel文件并进行格式化 在C#中读取Excel文件的最佳实践 C# Excel范围选择和操作 导入Excel数据到C#应用程序 开始您的免费IronXL试用许可证,以便在您自己的项目中运行这些示例。 当您准备好部署时,请购买生产许可证或与团队聊天以获得许可指导。 立即开始使用 IronXL。 免费开始 常见问题解答 如何使用IronXL将 Excel 数据导出到 C# 中的 DataTable? 您可以使用IronXL将 Excel 数据导出到 C# 中的 DataTable,方法是将 Excel 文件加载到IronXL中,选择工作表或范围,然后使用 ExportToDataTable 方法将数据转换为 DataTable 对象。 将 Excel 数据转换为 DataTable 有什么好处? 将 Excel 数据转换为 DataTable 可以提供结构化数据,非常适合数据库操作、与 UI 控件的数据绑定以及与.NET 的无缝集成。它还有助于在 C# 应用程序中轻松操作和处理数据。 IronXL能否处理 Excel 和 DataTable 之间的数据导入和导出? 是的, IronXL可以高效地处理从 Excel 导入数据到 DataTable 以及从 DataTable 导出数据到 Excel 的操作,使其成为管理 C# 应用程序中数据交换的多功能工具。 是否可以使用IronXL将 Excel 工作表中的特定区域转换为 DataTable? 是的, IronXL允许您选择 Excel 工作表中的特定范围并将其转换为数据表,从而让您在数据操作和提取方面拥有更大的灵活性。 我是否需要安装 Microsoft Office 才能使用IronXL进行 Excel 数据转换? 不,您无需在计算机上安装 Microsoft Office 即可使用IronXL将 Excel 数据转换为 DataTable 或反之亦然。IronXL的运行独立于 Microsoft Office。 IronXL可以将 Excel 中的哪些数据类型转换为 DataTable? IronXL可以将 Excel 中的各种数据类型(包括数字、文本、日期和公式)转换为 DataTable 格式,同时保持数据的完整性和结构。 IronXL能否将DataTable导出回Excel文件? 是的, IronXL可以将 DataTable 导出回 Excel 文件,从而允许您直接从 C# 应用程序生成报告或创建数据存储解决方案。 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 工作簿。 阅读更多 使用 OleDb 或IronXL将数据表导出到 Excel(C#)如何在未安装 Excel 的情况...
已更新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 工作簿。 阅读更多