在 .NET 开发中,经常会遇到处理 Excel 数据的场景。为了便于结构化管理,开发者通常会将 Excel 文件转换为 DataTable。这样不仅能够方便地执行 LINQ 查询,还能轻松绑定到 DataGridView 等 UI 控件,甚至批量写入数据库。
然而,在 C# 中实现 Excel 转换为 DataTable 并非总是直观易行。传统方法往往依赖 OLEDB 驱动,或者需要编写复杂的 OpenXML 代码——前者依赖额外组件,后者实现繁琐。
本文将介绍一种更简洁高效的方式,使用 Spire.XLS for .NET 直接通过 C# 代码完成 Excel 到 DataTable 的转换,支持整表导入或指定区域导出,无需外部依赖,也避免了冗余代码。
快速导航
- C# 中的 DataTable 及其应用
- 环境准备
- 在 C# 中将 Excel 转换为 DataTable
- 扩展:将 DataTable 导出回 Excel
- 处理大型 Excel 文件与性能优化
- 最佳实践
- 总结
- 常见问题
什么是 DataTable,为什么要使用它?
在 C# 中,DataTable 是一种驻留在内存中的表格化数据结构,常用于处理来自 Excel、数据库或其他数据源的数据。它的优势包括:
- 以表格形式存储 Excel 数据;
- 支持过滤、排序和 LINQ 查询;
- 可直接绑定到 DataGridView 等 UI 控件;
- 便于批量写入数据库。
与 DataSet 相比,DataTable 更加轻量,尤其适合处理单个工作表或指定数据范围。
环境准备
在开始之前,需要在项目中安装 Spire.XLS for .NET。通过 NuGet 安装最为简便:
Install-Package Spire.XLS
然后在代码中引入所需的命名空间:
using Spire.Xls;
using System.Data;
在 C# 中将 Excel 转换为 DataTable
下面的示例展示了如何加载 Excel 文件并将其数据导入到 DataTable 中。此方法不依赖 OLEDB,也不需要 Microsoft Office 环境,因此既适用于桌面应用,也能在服务端稳定运行。
加载 Excel 文件
Workbook workbook = new Workbook();
workbook.LoadFromFile("Sample.xlsx");
以上代码会从指定路径加载 Excel 文件,并生成 Workbook 对象,之后即可访问其中的工作表。
将整个工作表导入 DataTable
Worksheet sheet = workbook.Worksheets[0];
DataTable dataTable = sheet.ExportDataTable(sheet.AllocatedRange, true);
这段代码会将第一张工作表的所有数据导入 DataTable:
- sheet.AllocatedRange 表示已使用的单元格区域;
- true 参数表示第一行作为列名导入。
这种方式适合需要完整导入表格的场景,例如绑定到 DataGridView 或批量写入数据库。
将指定范围导入 DataTable
DataTable partialTable = sheet.ExportDataTable(sheet.Range["A1:C10"], true);
该方法只会将 A1:C10 区域的数据导入 DataTable。 在处理大型文件时,这种按需提取的方式尤其实用,比如仅导入报表中的部分内容。
完整示例
下面的示例展示了从加载 Excel 文件到导出 DataTable 并输出结果的完整流程:
using Spire.Xls;
using System.Data;
class Program
{
static void Main()
{
// 加载 Excel 文件
Workbook workbook = new Workbook();
workbook.LoadFromFile("Sample.xlsx");
// 将第一个工作表导出为 DataTable
Worksheet sheet = workbook.Worksheets[0];
DataTable dataTable = sheet.ExportDataTable(sheet.AllocatedRange, true);
// 输出行数
Console.WriteLine("Rows imported: " + dataTable.Rows.Count);
// 输出列名
foreach (DataColumn col in dataTable.Columns)
{
Console.Write(col.ColumnName + "\t");
}
Console.WriteLine();
// 输出所有数据
foreach (DataRow row in dataTable.Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + "\t");
}
Console.WriteLine();
}
}
}
运行后,程序会将 Excel 第一张工作表中的数据导出为 DataTable,并在控制台输出结果:
如果需要逐个单元格读取数据,请参考 在 C# 中读取 Excel 文件。
扩展:将 DataTable 导出回 Excel
有时还需要将修改后的 DataTable 数据重新写入 Excel 文件。可以使用如下方法实现:
Workbook wb = new Workbook();
Worksheet ws = wb.Worksheets[0];
// 假设 dataTable 已经有数据
ws.InsertDataTable(dataTable, true, 1, 1);
wb.SaveToFile("Output.xlsx", ExcelVersion.Version2016);
这段代码会从 A1 单元格开始插入 DataTable 数据,并保存为新文件,从而实现 Excel 与 C# 之间的数据双向交互。 详细教程请参考:在 C# 中将 DataTable 导出到 Excel。
处理大型 Excel 文件与性能优化
当处理数据量较大的 Excel 文件时,可以考虑以下优化策略:
- 只加载所需工作表,避免一次性加载整个文件;
- 导出指定范围,而非整张表;
- 使用 LoadFromStream 方式加载,避免文件锁定问题;
- 对于超大 DataTable,逐行处理以降低内存占用。
Spire.XLS 同时支持 .xls、.xlsx 和 .csv 格式,能够灵活应对不同应用场景。
最佳实践
在进行 Excel 与 DataTable 转换时,建议注意以下几点:
- 数据类型转换:Excel 默认以文本存储,必要时需转为 int、decimal 或 DateTime;
- 空值处理:提前检查空单元格,避免运行时错误;
- 数据库集成:在将 DataTable 批量写入数据库前,应先进行数据验证和清理。
总结
在 .NET 开发中,将 Excel 数据转换为 DataTable 是一项常见且重要的任务。借助 Spire.XLS for .NET,开发者无需依赖 OLEDB 驱动或繁琐的 OpenXML 编程,即可高效完成转换。
无论是整表导入、区域提取,还是将数据回写到 Excel,都能通过简洁直观的方式实现。掌握这一流程,将显著提升 Excel 与 C# 应用之间的集成效率与稳定性。
如果需要完整功能,可以 申请免费临时授权。对于小型项目,还可以使用 Free Spire.XLS for .NET。
常见问题
如何在 C# 中将 Excel 导入 DataTable?
使用 Worksheet.ExportDataTable() 方法即可直接导入。
能否在不依赖 OLEDB 的情况下读取 Excel?
可以。Spire.XLS 不依赖 OLEDB,也无需安装 Microsoft Office。
如何只读取指定工作表或范围?
将目标 Worksheet 或 Range 传入 ExportDataTable() 方法即可。
可以在 C# 中将 DataTable 导出回 Excel 吗?
可以。使用 Worksheet.InsertDataTable() 并调用 SaveToFile() 保存文件。