【问题标题】:How to find DataValidation list for an Excel cell using EPPlus如何使用 EPPlus 查找 Excel 单元格的 DataValidation 列表
【发布时间】:2017-03-02 16:12:41
【问题描述】:

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

到目前为止,我得到了:

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

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

  • 我坚持的步骤是查找给定单元格是否是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

【问题讨论】:

    标签: excel epplus


    【解决方案1】:

    差不多了,只需检查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
    

    【讨论】:

    • sheet.Cells[list.Formula.ExcelFormula] 你确定这行得通吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    相关资源
    最近更新 更多