如何使用EPPlus查找Excel单元格的DataValidation列表
我有一个工作簿,其数据validation被指定为允许值的下拉列表。 使用EPPlus,我希望能够得到每个这样的单元格,允许值的列表。
到目前为止,我得到了:
-
ExcelWorkSheet.DataValidations
为我提供了一个ExcelDataValidationCollection
,它是工作表的IExcelDataValidation
项的集合。 -
每个
IExcelDataValidation
都有一个types为ExcelAddress
的Address属性,它大概会引用具有该validation规则的所有单元格。 -
我坚持的步骤是查找给定的单元格是否包含在
ExcelAddress
中的单元格之一
任何接受者?
我目前正在使用EPPlus 3.1.1.0,但可以根据需要升级到更新的版本。
UPDATE
我没有足够清楚地解释这一点。 这是我更详细的情况。
-
假设列C具有一些具有列表数据validation的单元。 有些细胞允许说,“A,B,C”; 其他单元格允许“D,E,F”等。每个数据validation列表的单元格范围不是连续的,因此,例如:
- C2,C4,C7-C10,C20可以允许“A,B,C”
- C3,C5-C6“,C15可以允许”D,E,F“
-
我试图确定哪些单元格允许“A,B,C”以及哪个单元允许“D,E,F”等
-
ExcelWorksheet.DataValidations包含ExcelDataValidationList项目,其中一个值为“A,B,C”,一个值为“D,E,F”等。
-
列表“A,B,C”的ExcelDataValidationList.Address包含一个ExcelAddress,其Address属性如下所示:“C4 C7:C10 C2 C20 …”。
-
我想确定一个给定的单元格(比如C6)是否包含在这个地址“C4 C7:C10 C2 C20 …”指定的范围内。
当然,我可以String.Split空白,并parsing每个项目在结果列表中。 但我希望能有一些更直接的方式来做到这一点,例如
ExcelAddress.Contains("C6")
要么
ExcelAddress.Contains(6, 2) // row 6 col 2 = C6
几乎在那里,只要检查IExcelDataValidation
的具体types。 经EPPlus 4.1.0.0testing:
using (var package = new ExcelPackage(new FileInfo(path))) { var sheet = package.Workbook.Worksheets[1]; var validations = sheet.DataValidations; foreach (var validation in validations) { var list = validation as ExcelDataValidationList; if (list != null) { var range = sheet.Cells[list.Formula.ExcelFormula]; var rowStart = range.Start.Row; var rowEnd = range.End.Row; // allowed values probably only in one column.... var colStart = range.Start.Column; var colEnd = range.End.Column; for (int row = rowStart; row <= rowEnd; ++row) { for (int col = colStart; col <= colEnd; col++) { Console.WriteLine(sheet.Cells[row, col].Value); } } } } }
testing工作表:
输出:
one two three