Skip to content

Double 类型转换行为与其他类型不一致 #881

@yangf85

Description

@yangf85

问题描述

在使用 MiniExcel 读取 xlsx 文件并映射到模型类时,发现 double 类型的转换行为与其他类型不一致:

  • 当模型属性为 double 类型,但 Excel 单元格中的数据是文字时,不会抛出异常,而是直接将属性值赋为 double.NaN
  • 当模型属性为其他类型(如 intdecimalDateTime 等),但 Excel 单元格数据无法转换时,会抛出类型转换异常

这种不一致的行为可能导致数据验证问题,因为 double.NaN 可能会被静默接受,而不是像其他类型一样明确报错。

重现步骤

1. 创建模型类:

csharp
public class TestModel
{
    public double DoubleValue { get; set; }
    public int IntValue { get; set; }
    public decimal DecimalValue { get; set; }
}

2. 准备 Excel 文件(test.xlsx):

DoubleValue | IntValue | DecimalValue
-- | -- | --
文字内容 | 文字内容 | 文字内容

3. 读取代码:

csharp
var rows = MiniExcel.Query<TestModel>("test.xlsx").ToList();

实际行为

  • DoubleValue 被赋值为 double.NaN,不抛出异常
  • IntValueDecimalValue 抛出类型转换异常

期望行为

建议保持一致的错误处理策略,有以下两种方案:

方案 1(推荐): 所有类型转换失败时都抛出异常,包括 double 类型

  • 优点:可以及时发现数据问题,便于调试和数据验证
  • 缺点:需要调整现有行为

方案 2: 为所有数值类型提供默认值处理(如 int 转换失败时返回 0)

  • 优点:统一的容错处理
  • 缺点:可能隐藏数据问题

环境信息

  • MiniExcel 版本:[请填写版本号]
  • .NET 版本:[请填写版本号]
  • 操作系统:[请填写系统信息]

补充说明

目前的行为可能是因为 double.TryParse() 对于无法解析的文字返回 double.NaN,而其他类型(如 int.TryParse())返回 false 导致抛出异常。但从用户体验角度,这种不一致的行为容易造成困惑和潜在的 bug。

希望能统一类型转换失败时的处理逻辑。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions