C#读取Excel空单元格报错处理及批量读取单元格代码优化问询
C# 读取Excel单元格常见问题解决方案
问题1:空单元格读取报错处理
报错核心原因是空单元格的Value属性会返回null或DBNull.Value,直接调用ToString()会触发空引用异常。你可以按照如下逻辑提前判空,同时兼容格式错误的异常:
// 先接收单元格原始值 object cellValue = sh.Cells[26, 2].Value; double test = 0; // 判空+安全转换 if (cellValue != null && cellValue != DBNull.Value) { // 优先用double.TryParse避免格式不匹配报错 if (double.TryParse(cellValue.ToString(), out double parsedVal)) { test = parsedVal; } else { // 格式错误时可自定义默认值 test = 0; } } else { // 单元格为空时的默认值处理 test = 0; }
也可以封装成通用方法简化调用:
public static double ReadCellToDouble(Worksheet sheet, int row, int col, double defaultValue = 0) { object val = sheet.Cells[row, col].Value; if (val == null || val == DBNull.Value) return defaultValue; return double.TryParse(val.ToString(), out double res) ? res : defaultValue; } // 调用示例 double test = ReadCellToDouble(sh, 26, 2);
问题2:简化连续单元格读取操作
连续单元格不需要逐行定义变量,直接用循环读取后存入集合即可,配合上面封装的通用读取方法,代码可以大幅简化:
// 定义存储结果的集合,索引对应行号偏移 List<double> results = new List<double>(); // 行号范围26到31,共6行 for (int row = 26; row <= 31; row++) { results.Add(ReadCellToDouble(sh, row, 2)); } // 后续使用直接按索引取值即可 double test1 = results[0]; // 对应原26行的值 double test2 = results[1]; // 对应原27行的值 // 以此类推
如果需要调整读取范围,只需要修改循环的起止行号即可,不需要新增重复代码。
内容的提问来源于stack exchange,提问作者Lukas Klossek
相关产品推荐
相关产品推荐

