LinqToExcel读取*.xlsx文件中Decimal类型数据异常求助
解决Linq to Excel读取货币格式Decimal字段返回0的问题
我之前踩过Linq to Excel处理货币格式Decimal的坑,折腾了好一阵子才搞定,给你几个实用的排查和解决方向:
清理货币格式的特殊字符
货币格式的单元格通常带$、千位分隔符,这些特殊字符,Linq to Excel默认的解析逻辑可能无法识别,导致返回0。你可以自定义类型映射来处理:var excelFactory = new ExcelQueryFactory("你的文件路径.xlsx"); // 给目标Decimal字段添加自定义映射 excelFactory.AddMapping<你的模型类>( model => model.你的Decimal字段, "Excel中的列名", cellValue => { var cleanValue = cellValue.ToString() .Replace("$", "") // 移除货币符号 .Replace(",", "") // 移除千位分隔符 .Trim(); return decimal.Parse(cleanValue, CultureInfo.InvariantCulture); } );确认Excel单元格的实际存储值
有时候单元格显示的是货币格式,但实际存储的是文本类型(比如手动输入带$的内容),这种情况下Linq to Excel无法自动转成Decimal。你可以选中单元格看编辑栏的内容:- 如果编辑栏显示带$的文本,先把单元格批量转成数值格式(Excel的“数据”选项卡→“分列”→直接完成,能快速把文本转数值)
- 也可以用Excel的
VALUE()函数测试,比如=VALUE(A1),如果能返回正常数值,说明只是格式问题,不是内容问题。
显式转换字段类型
如果自定义映射不方便,也可以在查询时手动转换字段值,避开自动推断的问题:var data = from row in excelFactory.Worksheet() select new 你的模型类 { 你的Decimal字段 = Convert.ToDecimal( row["Excel列名"].ToString().Trim('$', ',') ), // 其他字段正常赋值 };检查Linq to Excel版本
旧版本的Linq to Excel对xlsx格式的货币解析存在bug,如果你用的是几年前的版本,建议更新到最新版,新版本对各种Excel格式的兼容性更好。
你提到“将列改为数字格式时……”,如果改成数字格式后能正常读取,那基本可以确定是货币符号和分隔符导致的解析失败,上面的字符替换方法应该能完美解决这个问题。
内容的提问来源于stack exchange,提问作者Obelix
相关产品推荐
相关产品推荐

