如何使用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