IRONSOFTWAREHOME
USING IRONXL

using C# 导出 Excel 数据表 | 转换 Excel 数据

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

将Excel数据导出到DataTable,使您可以结构化地在内存中访问电子表格内容,与数据库、UI控件和LINQ查询自然集成。 相反方向——将DataTable写回Excel文件——对于报告生成和数据存储工作流程同样重要。 IronXL 完全基于 .NET 实现双向处理,无需依赖 Microsoft Office,也无需配置 COM 互操作。

在运行以下任何示例之前,请先安装 IronXL:

PM > Install-Package IronXL.Excel

安装后,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();
}

代码功能说明

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();
}

为何范围选择至关重要

括号语法IronXL.Range对象。 在该范围上调用ToDataTable限制处理精确到那些单元,这意味着当源文件有成千上万行时,执行速度更快且内存占用更小。

您还可以指定命名范围,或在运行时动态构建范围字符串——例如$"A1:D{lastRow}"——使该方法对可变长度数据导出具有灵活性。 Range 类 API 参考文档记录了所有可用的选择和查询方法。

如何将多工作表工作簿转换为 DataSet?

具有多个工作表的工作簿自然映射到DataTableToDataSet方法在一次调用中执行此转换。

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();
}

按名称访问工作表

返回的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.");

单元写入循环的工作原理

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;

绑定时发生什么

设置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}");
}

为何在 DataTable 上使用 LINQ 很有用

LINQ 查询为您提供了一种可读性强且强类型化的方式,用于过滤、排序、分组以及从转换后的工作表中投影数据。 InvalidCastException,而不是返回静默空值。 这有助于更早地发现数据质量问题。

将此方法与前文所述的基于范围的导出功能结合使用,可查询特定的工作表区域而非整个工作表,从而在处理大文件时保持较低的内存占用。

导出时如何处理空值和空单元格?

Excel 电子表格中常存在空白区域——如空单元格、合并区域或占位符文本。 IronXL在导出的DBNull.Value,匹配标准的ADO.NET行为,因此您现有的空值处理代码可无需修改。

IronXL 如何将 Excel 单元格状态映射到 DataTable 值
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}");
}

此模式特别适用于在存在内存限制的 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.");

列映射注意事项

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 技能,请探索以下相关主题:

立即获取 IronXL 免费试用许可证,在您的项目中运行这些示例。 当您准备部署时,请购买生产版许可证,或与团队联系以获取许可指导。

第一步:
arrow pointer
Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户