如何使用EPPlus

时间:2017-03-01 21:50:24

标签: excel epplus

我有一个包含许多单元格的工作簿,这些单元格已将数据验证指定为允许值的下拉列表。使用EPPlus,我希望能够获得每个这样的单元格,即允许值列表。

到目前为止,我已经:

  • ExcelWorkSheet.DataValidations为我提供了一个ExcelDataValidationCollection,它是工作表中IExcelDataValidation项的集合。

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

  • 我坚持的步骤是查找给定的单元格是ExcelAddress

  • 中包含的单元格之一

任何参赛者?

我目前正在使用EPPlus 3.1.1.0,但如有必要,可以升级到更新的版本。

更新

我没有足够清楚地解释这一点。这是我的情况更详细。

  • 假设列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

1 个答案:

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

测试工作表:

enter image description here

输出:

one
two
three