使用EPPlus读取Excel数值时如何保留原格式(含千分位与小数位)
解决EPPlus读取Excel带千分位数值格式的问题
核心问题原因
Excel中的千分位是显示格式,并非数值本身的一部分,所以Cell.Value会返回纯数值(自动去除千分位)。你遇到.Text返回0的情况,大概率是EPPlus 5.x及以上版本未正确设置许可证上下文,导致格式读取功能受限。
解决方案
1. 先设置EPPlus许可证上下文(5.x+必填)
EPPlus 5.0+要求显式声明许可证类型,否则部分格式读取功能会异常:
ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 非商用场景,商用请改为LicenseContext.Commercial
2. 读取单元格的格式化显示文本
使用GetFormattedText()方法(EPPlus 5+支持)直接获取单元格显示的格式化字符串,保留千分位和小数:
using (var package = new ExcelPackage(new FileInfo(fileStr))) { ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; int rowCount = worksheet.Dimension.End.Row; for (int row = 2; row <= rowCount; row++) { var cell = worksheet.Cells[row, 1]; // 获取带千分位和小数的格式化文本 string formattedAmt = cell.GetFormattedText(); // 执行后续格式验证逻辑 bool isDecimalValid = IsValidFormattedDecimal(formattedAmt); } }
3. 旧版EPPlus(4.x)兼容方案
如果使用EPPlus 4.x,可通过单元格的格式规则手动格式化数值:
using (var package = new ExcelPackage(new FileInfo(fileStr))) { ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; int rowCount = worksheet.Dimension.End.Row; for (int row = 2; row <= rowCount; row++) { var cell = worksheet.Cells[row, 1]; string formattedAmt = string.Empty; if (cell.Value is decimal amtDecimal) { // 用单元格的原始格式规则格式化数值 formattedAmt = amtDecimal.ToString(cell.Style.NumberFormat.Format, System.Globalization.CultureInfo.InvariantCulture); } // 如果单元格是文本型的带千分位数值,直接取Value else if (cell.Value is string amtStr) { formattedAmt = amtStr; } // 验证逻辑 bool isDecimalValid = IsValidFormattedDecimal(formattedAmt); } }
4. 格式验证示例
以下是验证带千分位、负号、两位小数格式的方法:
private bool IsValidFormattedDecimal(string input) { // 正则匹配规则:可选负号 + 1-3位数字 + 可选的(,三位数字) + .两位小数 string pattern = @"^-?\d{1,3}(,\d{3})*\.\d{2}$"; return System.Text.RegularExpressions.Regex.IsMatch(input, pattern); }
注意事项
- 确保Excel单元格的格式设置正确(如设置为「数值-带千分位和两位小数」),而非文本格式(文本格式可直接读取
Value)。 - 若使用商用EPPlus,需将
LicenseContext设置为LicenseContext.Commercial并获取合法授权。
内容的提问来源于stack exchange,提问作者Cordelia
相关产品推荐
相关产品推荐

