2017-03-01 85 views
1

我有一个数字,有指定为可允许值的下拉列表数据验证单元的工作簿中的Excel单元格资料验证列表。使用EPPlus,我希望能够获得每个这样的单元格的允许值列表。如何找到使用EPPlus

到目前为止我有:

  • ExcelWorkSheet.DataValidations给我一个ExcelDataValidationCollection,这是IExcelDataValidation项目工作表的集合。

  • 每个IExcelDataValidation都有一个ExcelAddress类型的地址属性,它可能会引用具有该验证规则的所有单元格。

  • 我卡上的步骤是找到一个给定的细胞是包含在ExcelAddress

任何考生的一个细胞?

我目前使用EPPlus 3.1.1.0,但如果需要可以升级到最新版本。

UPDATE

我没有解释这显然不够。这是我更详细的情况。

  • 假设C列有一些单元格带有列表数据验证。有些细胞允许说“A,B,C”;其它细胞允许 “d,E,F” 等的细胞为每个数据验证列表的范围是不连续的,所以,例如:

    • 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的空格,并解析每个项目在结果列表中。但我希望能有更直接的方式来做到这一点,例如

ExcelAddress.Contains("C6") 

ExcelAddress.Contains(6, 2) // row 6 col 2 = C6 

回答

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); 
       } 
      } 
     } 
    } 
} 

测试工作表:

enter image description here

输出:

one 
two 
three 
+0

sheet.Cells [list.Formula.ExcelFormula]你确定这是工作? – kassi