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

如何使用NPOI以编程方式评估Excel数据验证?

.NET中校验Excel单元格是否符合数据验证规则的方案

目前NPOI(.NET生态中对应Apache POI的Excel操作库)并没有提供类似Java里DataValidationEvaluator的现成验证评估API,你需要自行实现底层的校验逻辑,你当前遍历工作表验证规则的思路是可行的。

实现要点

  • 先通过xssfValidation.Regions获取验证规则作用的单元格范围,避免对无关单元格做无效校验
  • 针对不同的验证类型(整数、小数、列表、日期等),先做对应的数据类型转换,再结合操作符进行判断
  • 处理列表型验证时,需从constraint.Formula1中读取允许的选项(可能是单元格区域或直接值列表),再校验单元格值是否在列表内
  • 若验证规则包含公式,需先计算公式结果再进行校验

优化后的代码示例

foreach (var s in sheets)
{
    ISheet sheet = wb.GetSheet(s.Name);
    var validations = sheet.GetDataValidations();
    foreach (var validation in validations)
    {
        var xssfValidation = (XSSFDataValidation)validation;
        var constraint = xssfValidation.ValidationConstraint;
        // 获取验证规则覆盖的单元格区域
        var regions = xssfValidation.Regions;
        foreach (var region in regions)
        {
            for (int row = region.FirstRow; row <= region.LastRow; row++)
            {
                for (int col = region.FirstColumn; col <= region.LastColumn; col++)
                {
                    ICell cell = sheet.GetRow(row)?.GetCell(col);
                    if (cell == null) continue;

                    bool isValueValid = false;
                    // 根据验证类型分支处理
                    switch (constraint.Type)
                    {
                        case DataValidationConstraint.ValidationType.INTEGER:
                            if (cell.CellType == CellType.Numeric && cell.NumericCellValue % 1 == 0)
                            {
                                long cellValue = (long)cell.NumericCellValue;
                                long formula1Val = long.Parse(constraint.Formula1);
                                switch (constraint.Operator)
                                {
                                    case DataValidationConstraint.OperatorType.BETWEEN:
                                        long formula2Val = long.Parse(constraint.Formula2);
                                        isValueValid = cellValue >= formula1Val && cellValue <= formula2Val;
                                        break;
                                    case DataValidationConstraint.OperatorType.EQUAL:
                                        isValueValid = cellValue == formula1Val;
                                        break;
                                    // 按需补充NOT_BETWEEN、NOT_EQUAL等其他操作符逻辑
                                }
                            }
                            break;
                        case DataValidationConstraint.ValidationType.LIST:
                            // 处理列表型验证,拆分允许的选项
                            string[] allowedValues = constraint.Formula1.Split(',');
                            string cellText = cell.ToString().Trim();
                            isValueValid = allowedValues.Contains(cellText);
                            break;
                        // 扩展处理DECIMAL、DATE、TEXT_LENGTH等其他验证类型
                    }

                    // 输出或记录校验结果
                    Console.WriteLine($"单元格({row+1},{col+1})值验证结果:{isValueValid}");
                }
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Dusan Stojkovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:30:45