跳至页脚内容
使用 IRONXL

使用 C# 导出 Excel 数据表 | 转换 Excel 数据

将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?

多个工作表的工作簿自然映射到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();
}
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技能,请探索这些相关主题:

开始您的免费IronXL试用许可证,以便在您自己的项目中运行这些示例。 当您准备好部署时,请购买生产许可证与团队聊天以获得许可指导。

立即开始使用 IronXL。
green arrow pointer

常见问题解答

如何使用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 机器人,将他对技术的热爱与创造力相结合。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me