使用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
相关产品推荐
相关产品推荐

