如何使用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
相关产品推荐
相关产品推荐

