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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:35:27