You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LinqToExcel读取Excel遇System.ArgumentException,如何忽略错误行?

解决LinqToExcel读取Excel日期格式错误抛异常的问题

LinqToExcel默认会自动尝试将Excel单元格值转换为对应.NET类型,遇到格式不匹配的日期时就会抛出ArgumentException中断读取。以下几种方法可以让你忽略错误并手动处理异常行:

方法一:关闭自动类型转换,手动处理所有字段

通过设置ReadWithoutParsing = true,让LinqToExcel直接读取原始字符串值,避免自动转换时抛出异常,之后你可以自行处理日期格式:

var excel = new ExcelQueryFactory(path);
// 关闭自动解析,所有值以字符串形式读取
excel.ReadWithoutParsing = true;

var worksheetNames = excel.GetWorksheetNames();
var worksheetName = worksheetNames.FirstOrDefault();
var allRows = excel.Worksheet(worksheetName).ToList();

foreach (var row in allRows)
{
    try
    {
        // 替换成你的日期列名
        string dateRaw = row["日期列"].ToString();
        DateTime validDate = DateTime.ParseExact(dateRaw, "yyyy-MM-dd", null);
        // 处理正常行逻辑
    }
    catch (FormatException)
    {
        // 记录错误行信息,比如行号、错误内容
        Console.WriteLine($"第{row.RowNumber}行日期格式无效:{row["日期列"]}");
        // 可选择标记该行或跳过
    }
}

方法二:逐行遍历并捕获异常

放弃直接调用ToList()一次性转换所有行,改为逐行遍历,用try-catch包裹每一行的类型转换操作,单独处理错误行:

var excel = new ExcelQueryFactory(path);
var worksheetNames = excel.GetWorksheetNames();
var worksheetName = worksheetNames.FirstOrDefault();
var worksheet = excel.Worksheet(worksheetName);

List<Row> validRows = new List<Row>();
List<string> errorLogs = new List<string>();

foreach (var row in worksheet)
{
    try
    {
        // 访问日期字段触发自动转换,若转换失败会抛出异常
        var _ = row["日期列"];
        validRows.Add(row);
    }
    catch (ArgumentException ex)
    {
        errorLogs.Add($"行号{row.RowNumber}:{ex.Message}");
        // 跳过错误行,继续处理下一行
    }
}

// 后续处理有效行和错误日志
Console.WriteLine($"共读取{validRows.Count}条有效数据,{errorLogs.Count}条错误行");
foreach (var log in errorLogs)
{
    Console.WriteLine(log);
}

方法三:全局设置转换异常处理器

通过ConvertExceptionHandler捕获所有类型转换异常,返回默认值避免中断遍历,之后再筛选出异常行:

var excel = new ExcelQueryFactory(path);
List<string> errorLogs = new List<string>();

// 注册转换异常处理器
excel.ConvertExceptionHandler = (ex, row, colName) =>
{
    errorLogs.Add($"行{row.RowNumber}列{colName}转换错误:{ex.Message}");
    // 返回DBNull作为异常字段的默认值,避免抛出异常
    return DBNull.Value;
};

var worksheetNames = excel.GetWorksheetNames();
var worksheetName = worksheetNames.FirstOrDefault();
var allRows = excel.Worksheet(worksheetName).ToList();

// 筛选出日期字段为DBNull的错误行
var errorRows = allRows.Where(r => r["日期列"] == DBNull.Value).ToList();

内容的提问来源于stack exchange,提问作者Ângelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 18:40:16