上一篇
C如何高效读取Excel表格数据并处理数据库格式?
- 行业动态
- 2025-05-11
- 5
C#可通过EPPlus或OLEDB库读取Excel数据,解析为DataTable或对象模型,处理格式转换与数据类型校验后,批量导入SQL数据库,需注意单元格格式兼容性、空值及异常处理,确保数据完整性。
在软件开发中,C#读取Excel表格数据是常见的业务需求,本文将通过技术细节、代码示例和最佳实践,详细说明如何高效处理Excel与数据库的交互,并确保数据格式的准确性。
准备工作
选择工具库
推荐使用以下开源库(避免依赖Office组件):
- EPPlus(支持.xlsx格式,性能优异)
- NPOI(兼容.xls和.xlsx,无需安装Office)
// 通过NuGet安装EPPlus Install-Package EPPlus
数据库连接
使用ADO.NET或Entity Framework:
using System.Data.SqlClient; // SQL Server示例
读取Excel数据
步骤1:加载Excel文件
using (var package = new ExcelPackage(new FileInfo("data.xlsx"))) { ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; int rowCount = worksheet.Dimension.Rows; int colCount = worksheet.Dimension.Columns; }
步骤2:遍历单元格
for (int row = 2; row <= rowCount; row++) { // 假设第一行为标题 var cellValue = worksheet.Cells[row, 1].Text; // 处理数据... }
处理数据格式
类型转换
Excel数据类型 | C#转换方法 | 示例 |
---|---|---|
日期 | DateTime.FromOADate() | double excelDate = 44197; DateTime date = DateTime.FromOADate(excelDate); |
数值 | double.TryParse() | double.TryParse(cellValue, out decimal result); |
文本 | 直接读取 | string text = cellValue.Trim(); |
空值处理
if (worksheet.Cells[row, col].Value == null) { // 标记为DBNull.Value或赋予默认值 }
与数据库交互
批量插入(SQL Server示例)
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString)) { bulkCopy.DestinationTableName = "TargetTable"; DataTable dataTable = ConvertExcelToDataTable(worksheet); // 自定义转换方法 bulkCopy.WriteToServer(dataTable); }
使用参数化查询
string sql = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)"; using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.Parameters.AddWithValue("@Name", userName); cmd.Parameters.AddWithValue("@Age", age); cmd.ExecuteNonQuery(); }
注意事项
性能优化
- 大型文件建议分块读取(如每次处理5000行)
- 启用
EPPlus
的ExcelPackage.UseMemoryStream = true
安全性
- 验证文件扩展名和内容类型
- 限制上传文件大小
兼容性
- 处理不同Excel版本(如2003的.xls与2007+的.xlsx)
- 处理合并单元格和公式计算值
常见问题
Q1:读取时出现“内存不足”错误?
- 使用
NPOI
的XSSF
事件模型逐行读取 - 避免将整个Excel加载到
DataTable
Q2:日期显示为数字?
- 使用
DateTime.FromOADate()
转换Excel的序列化日期
Q3:如何提升导入速度?
- 禁用Excel公式计算:
worksheet.Calculate(false);
- 使用数据库批量插入而非逐行提交
通过EPPlus
/NPOI
读取Excel数据时,需重点关注:
- 数据类型匹配(尤其是日期和数值)
- 空值和异常数据的容错处理
- 使用批量操作减少数据库压力
实际项目中建议封装通用工具类,并添加日志记录和异常捕获机制。
引用说明
- EPPlus官方文档:https://epplussoftware.com/
- NPOI GitHub仓库:https://github.com/nissl-lab/npoi
- ADO.NET最佳实践:Microsoft Learn文档
- SQL Bulk Insert指南:Microsoft SQL Server技术手册