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
相关产品推荐
相关产品推荐

