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

EPPlus ToCollection<T>无需手动映射属性读取Excel失败求解

EPPlus自动映射时Double转Int32异常的解决方法

问题本质

Excel默认将所有数值以Double类型存储,哪怕你写入的是int值。EPPlus的ToCollection<T>自动映射逻辑未处理Double到Int32的隐式转换,因此抛出类型转换异常。而手动映射使用的GetValue<int>方法内部做了转换处理,所以能正常运行。

三种无需手动全量映射的解决办法

1. 全局注册类型转换器

给EPPlus添加自定义转换器,让它支持Double转Int32,所有自动映射场景均可生效:

// 在读取Excel前注册转换器
ExcelRangeBase.RegisterTypeConverter(typeof(int), new Int32Converter());

// 自定义转换器实现
public class Int32Converter : ExcelDefaultTypeConverter
{
    public override object ConvertFromExcel(object value)
    {
        if (value is double num)
        {
            return Convert.ToInt32(num);
        }
        return base.ConvertFromExcel(value);
    }
}

注册后直接调用table.ToCollection<Person>()即可自动完成类型转换。

2. 写入时指定列数据类型

从源头避免类型不匹配,写入Excel时将数值列设为整数类型:

using (var pck = new ExcelPackage("PersonsTest.xlsx"))
{
    var sheet = pck.Workbook.Worksheets.Add("Persons");
    var range = sheet.Cells["A1"].LoadFromCollection<Person>(persons, true, TableStyles.None);
    
    // 设置Height列(第3列)的格式和数据类型为整数
    sheet.Column(3).Style.Numberformat.Format = "0";
    range["C:C"].DataType = ExcelDataType.Number;
    
    pck.Save();
}

写入后的Height列会以整数类型存储,再次读取时自动映射即可正常工作。

3. 给类属性添加转换特性

针对特定类的属性单独配置转换器,仅对该属性生效:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    
    [ExcelColumn(ConverterType = typeof(Int32Converter))]
    public int Height { get; set; }
    
    public DateTime BirthDate { get; set; }
}

这里的Int32Converter与第一种方案中的实现一致,EPPlus映射该属性时会自动使用自定义转换逻辑。

内容的提问来源于stack exchange,提问作者kwomba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:13:17