使用 NPOI 在 Excel Sheet 上进行条件数据验证

Conditional Data Validation on an Excel Sheet with NPOI

我正在尝试做一个 excel 来导入一些带有验证的数据,我以前从未使用过 npoi(我对 excel 的了解是作为用户)所以我有点迷失了我的 objective 在这里,也没有在互联网上找到直接的答案。

我的数据 sheet 包含三列 A、B 和 C。

然后我有另一个 sheet 我想在其中输入我的验证。它有两列:

像这样:

我的代码是这样的。如您所见,我的公式约束仅针对 columnB 数据,因为我什至无法对两列进行约束(我想公式应该是这样的:='Data'!$C$2:$C$3; 'Data'!$B$2:$B$6 但它不起作用)

internal static void Validations(ISheet sheet, int countLim)
    {
        // Data Validation 
        XSSFDataValidationHelper validationHelper = new((XSSFSheet)sheet);
        // Option Validation
        CellRangeAddressList optionList = new(1, countLim - 1, 1, 1);
        XSSFDataValidationConstraint tclconstraint = (XSSFDataValidationConstraint)validationHelper.CreateFormulaListConstraint("=Data!$A:$A");
        XSSFDataValidation tclvalidation = (XSSFDataValidation)validationHelper.CreateValidation(tclconstraint, optionList);
        sheet.AddValidationData(tclvalidation);
        // Result Validation
        CellRangeAddressList resultList = new(1, countLim - 1, 2, 2);
        XSSFDataValidationConstraint opconstraint = (XSSFDataValidationConstraint)validationHelper.CreateFormulaListConstraint("=Data!$B:$B");
        XSSFDataValidation opvalidation = (XSSFDataValidation)validationHelper.CreateValidation(opconstraint, resultList);
        sheet.AddValidationData(opvalidation);
        
    }

谢谢!

我终于可以通过 java poi 文档(在我看来比 npoi 更广泛)实现我的 objective。 我最后做的是:

//ColumnA/B List Range 
var namedRange = workbook.CreateName();
namedRange.NameName = "Columns";
string reference = "Data!$A:$B";
namedRange.RefersToFormula = reference;

//List when option 1
namedRange = workbook.CreateName();
namedRange.NameName = "1Options";
reference = "Data!$A:$A";
namedRange.RefersToFormula = reference;

//List when option 2
namedRange = workbook.CreateName();
namedRange.NameName = "2Options";
reference = "Data!$B:$B";
namedRange.RefersToFormula = reference;

//Conditional Validation
var rowNumber = 2;
for (int i = 0; i <= totalRows; i++)
{
    sheet.ActiveCell = new CellAddress("A" + rowNumber);
    var dvHelper = sheet.GetDataValidationHelper();
    var dvConstraint = dvHelper.CreateFormulaListConstraint("Columns");
    CellRangeAddressList checkList = new(1, totalRows - 1, 1, 1);
    var tclvalidation = dvHelper.CreateValidation(dvConstraint, checkList);
    sheet.AddValidationData(tclvalidation);

    dvConstraint = dvHelper.CreateFormulaListConstraint("INDIRECT($A$" + rowNumber + ")");
    CellRangeAddressList conditionList = new(1, totalRows - 1, 2, 2);
    tclvalidation = dvHelper.CreateValidation(dvConstraint, conditionList);
    sheet.AddValidationData(tclvalidation);

    rowNumber++;
}

请注意,我最终只制作了两列并将其用作第一个验证列的标题。因此,A 列消失了,B 列标题转换为选项 1,C 列标题转换为选项 2。

此外,我终于使用了两个 sheet。因此,列表范围是在名为 'Data' 的 sheet 和 sheet object

上进行的验证