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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:55:17