EPPlus读取Excel时误将逗号识别为小数点的文本获取问题求助
解决EPPlus读取文本格式"1,4"被识别为1.4的问题
踩过这个坑的过来人告诉你,这是EPPlus默认的自动类型推断在搞鬼!即使你在Excel里把单元格设为文本格式输入1,4,EPPlus的默认配置还是会把它当成数值类型解析成1.4的Decimal。下面给你几个靠谱的解决思路:
办法1:直接读取单元格的Text属性
如果你只是需要获取单元格显示的原始文本内容,最简单的方式就是直接调用单元格的Text属性,而不是Value属性。Text会返回Excel界面上实际显示的文本,完全保留原始格式:
using (var package = new ExcelPackage(new FileInfo("your_excel_file.xlsx"))) { var worksheet = package.Workbook.Worksheets.First(); // 直接读取Text属性,拿到原始的"1,4" string rawStickyBadgeText = worksheet.Cells["你的目标单元格位置"].Text; // 后续拆分处理 string[] splitValues = rawStickyBadgeText.Split(','); }
办法2:全局设置工作表的读取模式为文本
如果你需要批量读取多个单元格,不想逐个处理,可以设置整个工作表的LoadOption为Text,强制EPPlus把所有单元格内容都当成文本读取,禁用自动类型推断:
using (var package = new ExcelPackage(new FileInfo("your_excel_file.xlsx"))) { var worksheet = package.Workbook.Worksheets.First(); // 全局设置读取模式为文本 worksheet.Cells.LoadOption = LoadOption.Text; // 读取到你的IndexList集合(假设是映射到实体类) var IndexList = worksheet.Cells["数据范围"].LoadFromCollection<YourModel>(...); // 获取目标数据并拆分 var targetItem = IndexList.FirstOrDefault(w => w.Name == "STICKYBADGEIDS"); if (targetItem != null) { string[] splitValues = targetItem.Value.Split(','); // 这里的Value就是原始的"1,4"字符串了 } }
办法3:确保实体类属性为字符串类型
如果你的IndexList是通过EPPlus的实体映射生成的,一定要确保对应接收内容的属性是string类型,避免EPPlus自动转换类型:
// 定义实体类时,接收内容的属性用string public class YourModel { public string Name { get; set; } public string Value { get; set; } // 必须是string类型,不能用decimal或int }
关键原因说明
EPPlus默认的LoadOption.Normal会根据单元格内容自动推断类型,当它看到1,4时,会把逗号当成小数点(取决于系统区域设置),从而解析成Decimal类型。通过上述方法强制读取文本,就能完全保留你输入的原始内容,后续的逗号拆分操作也能正常进行。
内容的提问来源于stack exchange,提问作者Oğuzhan SARI
相关产品推荐
相关产品推荐

