使用EPPlus通过LINQ读取数据始终返回Null的问题求助
解决EPPlus LINQ读取Excel数据返回空/结果异常的问题
问题1:单个单元格LINQ查询返回Null
你直接用myWorksheet.Cells["B21"]能获取到0.55,但LINQ查询返回空,核心原因是LINQ查询返回的是IEnumerable<ExcelRangeBase>类型的序列,而非单个单元格对象。如果直接引用查询变量却不执行枚举操作(比如FirstOrDefault()),就会得到空结果。
修正代码:
// 执行查询并获取第一个匹配的单元格 var query1 = (from cell in myWorksheet.Cells["B21"] where cell.Value is double && (double)cell.Value >= .33 && (double)cell.Value <= 10000 select cell).FirstOrDefault();
更简洁的写法:
var query1 = myWorksheet.Cells["B21"] .Where(cell => cell.Value is double d && d >= .33 && d <= 10000) .FirstOrDefault();
问题2:文本查询返回0而非预期行号
你的searchCell查询返回的是IEnumerable<int>类型的行号序列,直接使用这个变量时,因为没有获取具体元素,会显示值类型的默认值0。需要从序列中取出匹配的行号:
获取第一个匹配行号:
var searchCell = (from cell in myWorksheet.Cells["A20:A33"] where cell.Value != null && cell.Value.ToString() == "Stuff" && cell.Start != null select cell.Start.Row).FirstOrDefault();
如果要获取所有匹配行号,改用ToList():
var matchedRows = (from cell in myWorksheet.Cells["A20:A33"] where cell.Value != null && cell.Value.ToString() == "Stuff" && cell.Start != null select cell.Start.Row).ToList();
额外注意事项
- EPPlus的
ExcelRange实现了IEnumerable<ExcelRangeBase>,遍历会逐个返回范围内的单元格,LINQ语法支持,但必须执行枚举操作(如FirstOrDefault()、ToList()、Count())才能拿到实际数据。 - 处理单元格值时,建议用模式匹配(
cell.Value is double d)替代强制类型转换,避免空引用或类型转换异常。
内容的提问来源于stack exchange,提问作者SpaghettiWestern
相关产品推荐
相关产品推荐

