
using C# 导出 Excel 数据表 | 转换 Excel 数据
将Excel数据导出到DataTable,使您可以结构化地在内存中访问电子表格内容,与数据库、UI控件和LINQ查询自然集成。 相反方向——将DataTable写回Excel文件——对于报告生成和数据存储工作流程同样重要。 IronXL 完全基于 .NET 实现双向处理,无需依赖 Microsoft Office,也无需配置 COM 互操作。
在运行以下任何示例之前,请先安装 IronXL:
安装后,System.Data结构上。 您还可以通过将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();
}Imports IronXL
Imports System.Data
' Load the workbook from disk
Dim workbook As WorkBook = WorkBook.Load("customers.xlsx")
' Grab the default (first) worksheet
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Convert the entire sheet; first row becomes column headers
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Iterate every row and print each cell value
For Each row As DataRow In dataTable.Rows
For i As Integer = 0 To dataTable.Columns.Count - 1
Console.Write(row(i) & vbTab)
Next
Console.WriteLine()
Next代码功能说明
WorkBook.Load读取XLSX文件而无需任何Office自动化。 DataColumn名称。 生成的SqlBulkCopy,或立即对其运行LINQ查询。
ToDataTable调用支持XLS和XLSX格式,因此相同的代码适用于传统电子表格,无需修改。 完整的 API 参考请参阅 IronXL DataTable 和 DataSet 文档。
如何将特定的单元格范围导出到 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();
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("financial_report.xlsx")
' Access a named worksheet
Dim worksheet As WorkSheet = workbook.GetWorkSheet("Summary")
' Select only the region A1:D20 and convert it
Dim dt As DataTable = worksheet("A1:D20").ToDataTable(True)
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}")
For Each row As DataRow In dt.Rows
For Each item In row.ItemArray
Console.Write(item & vbTab)
Next
Console.WriteLine()
Next为何范围选择至关重要
括号语法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();
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("multi_sheet.xlsx")
' Each worksheet becomes a DataTable inside the DataSet
Dim dataSet As DataSet = workbook.ToDataSet()
For Each table As DataTable In dataSet.Tables
Console.WriteLine($"Sheet: {table.TableName}")
Console.WriteLine($"Rows: {table.Rows.Count}")
Console.WriteLine()
Next按名称访问工作表
返回的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.");Imports IronXL
Imports System.Data
' Build a sample DataTable
Dim dt As New DataTable()
dt.Columns.Add(New DataColumn("ProductID", GetType(Integer)))
dt.Columns.Add(New DataColumn("ProductName", GetType(String)))
dt.Columns.Add(New DataColumn("UnitPrice", GetType(Decimal)))
dt.Rows.Add(1, "Widget Pro", 29.99D)
dt.Rows.Add(2, "Gadget Max", 49.99D)
dt.Rows.Add(3, "Sensor Kit", 14.50D)
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create()
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")
' Write column headers from DataTable.Columns
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next
' Write data rows
For row As Integer = 0 To dt.Rows.Count - 1
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(row + 1, col, dt.Rows(row)(col))
Next
Next
' Save as XLSX
workbook.SaveAs("products_export.xlsx")
Console.WriteLine("Export complete.")单元写入循环的工作原理
object值,因此无需任何类型转换即可为标题行传递列名,为数据行传递原始单元值。 row + 1的行偏移保留第0行作为标题。 生成的 XLSX 文件是一个完全有效的电子表格——不含占位符,也不含临时文件。
对于较大的 DataTables,建议在写入数据后启用列自动调整大小功能,以便内容能清晰显示,无需手动格式化。
如何将 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;Imports IronXL
Imports System.Data
Imports System.Windows.Forms
Dim workbook As WorkBook = WorkBook.Load("inventory.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable绑定时发生什么
设置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}");
}Imports IronXL
Imports System.Data
Imports System.Linq
Dim workbook As WorkBook = WorkBook.Load("sales.xlsx")
Dim dt As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
' Filter rows where the "Revenue" column exceeds 10000
Dim highRevenue = dt.AsEnumerable() _
.Where(Function(row) row.Field(Of Double)("Revenue") > 10000) _
.OrderByDescending(Function(row) row.Field(Of Double)("Revenue")) _
.ToList()
Console.WriteLine($"High-revenue records: {highRevenue.Count}")
For Each row In highRevenue
Console.WriteLine($"{row("Product")}: {row("Revenue"):C}")
Next为何在 DataTable 上使用 LINQ 很有用
LINQ 查询为您提供了一种可读性强且强类型化的方式,用于过滤、排序、分组以及从转换后的工作表中投影数据。 InvalidCastException,而不是返回静默空值。 这有助于更早地发现数据质量问题。
将此方法与前文所述的基于范围的导出功能结合使用,可查询特定的工作表区域而非整个工作表,从而在处理大文件时保持较低的内存占用。
导出时如何处理空值和空单元格?
Excel 电子表格中常存在空白区域——如空单元格、合并区域或占位符文本。 IronXL在导出的DBNull.Value,匹配标准的ADO.NET行为,因此您现有的空值处理代码可无需修改。
| Excel 单元格状态 | DataTable 值 | 注意事项 |
|---|---|---|
| 文本内容 | 字符串 | 按原样返回 |
| 数值 | 双精度或十进制 | 取决于单元格格式 |
| 日期值 | 日期时间 | 根据序列号解析 |
| 布尔值 | 布尔 | Excel 中的 TRUE/FALSE |
| 空单元格 | DBNull.Value | 标准 ADO.NET null |
| 公式单元格 | 计算结果 | IronXL 会先评估公式 |
当将DBNull.Value字段产生空单元,从而保持往返一致性。 如果您需要空字段的默认字符串,请在调用DBNull.Value。
如需更多数据准备指南,请参阅 Microsoft 的 DataTable 类文档,其中深入介绍了空值处理、约束管理以及行状态。
导出大型工作表时如何节省内存?
对于包含数千行数据的电子表格,一次性导出整个表格会将所有数据同时加载到内存中。 IronXL 的两种模式可降低峰值内存占用:
- 范围导出:使用
worksheet["A1:D5000"].ToDataTable(true)处理边界区域而非整张工作表。 - 批处理:使用
worksheet.RowCount计算最后一次使用的行,然后遍历固定大小的范围——例如一次1,000行——并在移动到下一个之前处理每批。
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}");
}Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("large_dataset.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim batchSize As Integer = 1000
Dim totalRows As Integer = worksheet.RowCount
For startRow As Integer = 1 To totalRows Step batchSize
Dim endRow As Integer = Math.Min(startRow + batchSize - 1, totalRows)
Dim rangeAddress As String = $"A{startRow}:Z{endRow}"
Dim batch As DataTable = worksheet(rangeAddress).ToDataTable(False)
' Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}")
Next此模式特别适用于在存在内存限制的 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.");Imports IronXL
Imports System.Data
Imports Microsoft.Data.SqlClient
Dim workbook As WorkBook = WorkBook.Load("orders.xlsx")
Dim dataTable As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
Dim connection字符串 As String = "Server=.;Database=OrdersDB;Trusted_Connection=True;"
Using connection As New SqlConnection(connection字符串)
connection.Open()
Using bulkCopy As New SqlBulkCopy(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)
End Using
End Using
Console.WriteLine("Bulk insert complete.")列映射注意事项
DataTable列名与数据库列名匹配。 如果两个名称相同,您可以省略单个映射,SqlBulkCopy将自动按名称匹配。 当电子表格的列顺序与数据库模式不一致时,显式映射更为稳妥。
有关将 IronXL 与数据库工作流结合使用的更多信息,请参阅 C# Excel 导入指南,其中涵盖了包括插入前验证在内的其他导入场景。
对于基于Entity Framework的项目,先将您的DataTable行转换为类型化的模型对象,然后使用EFCore.BulkExtensions库中的DbContext.BulkInsert进行ORM感知批量插入。 微软的 SqlBulkCopy 文档详细说明了批处理选项和事务支持。
下一步计划是什么?
您现在拥有一个完整工具包,可以使用IronXL在Excel和DataTable之间双向移动数据:
- 使用
worksheet.ToDataTable(true)转换完整的工作表进行支持标题的导出 - 使用
worksheet["A1:D20"].ToDataTable(true)语法导出特定的单元范围 - 使用
DataSet访问 - 通过
DataTable内容写回XLSX - 使用单个
DataGridView的UI控件 - 从
SqlBulkCopy提供数据,以实现高吞吐量的数据库插入
若想深入掌握 IronXL 技能,请探索以下相关主题:
- 导出 DataSet 和 DataTable -- 完整 API 参考
- 在 C# 中不使用 OleDb 将 Excel 转换为 DataTable
- C# DataTable 导出到 Excel 教程
- 从 ASP.NET 将 DataTable 导出到 Excel
- 将 DataTable 导出到 Excel 的最快方法
- 在 C# 中加载和读取 Excel 文件
- 导出带格式设置的 Excel 文件
- 使用 C# 读取 Excel 文件——最佳实践
- C# Excel 区域选择与操作
- 将 Excel 数据导入 C# 应用程序
立即获取 IronXL 免费试用许可证,在您的项目中运行这些示例。 当您准备部署时,请购买生产版许可证,或与团队联系以获取许可指导。

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



