我有一个包含许多单元格的工作簿,这些单元格已将数据验证指定为允许值的下拉列表。使用EPPlus,我希望能够获得每个这样的单元格,即允许值列表。
到目前为止,我已经:
ExcelWorkSheet.DataValidations
为我提供了一个ExcelDataValidationCollection
,它是工作表中IExcelDataValidation
项的集合。
每个IExcelDataValidation
都有一个类型为ExcelAddress
的Address属性,可能会引用具有该验证规则的所有单元格。
我坚持的步骤是查找给定的单元格是ExcelAddress
任何参赛者?
我目前正在使用EPPlus 3.1.1.0,但如有必要,可以升级到更新的版本。
更新
我没有足够清楚地解释这一点。这是我的情况更详细。
假设列C有一些列表数据验证的单元格。有些细胞可以说是“A,B,C”;其他单元格允许“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,并解析结果列表中的每个项目。但我希望能有更直接的方法来做到这一点,例如。
ExcelAddress.Contains("C6")
或
ExcelAddress.Contains(6, 2) // row 6 col 2 = C6
答案 0 :(得分:0)
几乎就在那里,只需查看IExcelDataValidation
的特定类型即可。使用EPPlus 4.1.0.0进行测试:
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);
}
}
}
}
}
测试工作表:
输出:
one
two
three