我试着做一个excel,在那里输入一些有验证的数据,而且我以前从未使用过npoi (而且我对excel的了解是作为用户),所以我在这里有点迷失了我的目标,也没有在互联网上建立一个直接的答案。
我有一个A,B,C三列的数据表。
'Option2'
然后,我有另一张纸,我想输入我的验证。它有两栏:
’,那么Column2列表应该显示
就像这样:
我的密码是这个。如您所见,我的公式约束只适用于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$2:$A$3");
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$2:$B$6");
XSSFDataValidation opvalidation = (XSSFDataValidation)validationHelper.CreateValidation(opconstraint, resultList);
sheet.AddValidationData(opvalidation);
}
谢谢!
发布于 2022-05-17 12:56:02
我最终可以通过java文档实现我的目标(在我看来,这个文档比npoi更广泛)。我最后做的是:
//ColumnA/B List Range
var namedRange = workbook.CreateName();
namedRange.NameName = "Columns";
string reference = "Data!$A$1:$B$1";
namedRange.RefersToFormula = reference;
//List when option 1
namedRange = workbook.CreateName();
namedRange.NameName = "1Options";
reference = "Data!$A$2:$A$6";
namedRange.RefersToFormula = reference;
//List when option 2
namedRange = workbook.CreateName();
namedRange.NameName = "2Options";
reference = "Data!$B$2:$B$3";
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。
另外,我最后用了两张床单。因此,列表范围是在一个名为“Data”的工作表上进行的,而工作表对象的有效性则是在该表对象上进行的。
https://stackoverflow.com/questions/72213877
复制相似问题