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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions