当前位置:首页 > 行业动态 > 正文

C如何高效读取Excel表格数据并处理数据库格式?

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

注意事项

  1. 性能优化

    • 大型文件建议分块读取(如每次处理5000行)
    • 启用EPPlusExcelPackage.UseMemoryStream = true
  2. 安全性

    • 验证文件扩展名和内容类型
    • 限制上传文件大小
  3. 兼容性

    • 处理不同Excel版本(如2003的.xls与2007+的.xlsx)
    • 处理合并单元格和公式计算值

常见问题

Q1:读取时出现“内存不足”错误?

  • 使用NPOIXSSF事件模型逐行读取
  • 避免将整个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技术手册
0