将列表验证添加到除前两行之外的列

时间:2015-04-21 06:10:41

标签: excel validation c#-4.0 epplus epplus-4

我正在尝试在创建excel时添加一个下拉列表(列表验证),我已经找到了将它添加到整列的方法,但我的场景不同,因为我只将验证添加到除第一行和第二行之外的整列行。

这是我到目前为止所尝试的:

 public MemoryStream GetExcelSheet()
    {
        using (var package = new ExcelPackage())
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Test");

            var val = worksheet.DataValidations.AddListValidation("A:A");

            val.Formula.Values.Add("Male");
            val.Formula.Values.Add("Female");
            val.ShowErrorMessage = true;

            worksheet.Cells["A1"].Formula = null;


            var stream = new MemoryStream(package.GetAsByteArray());
            return stream;
        }
    }

我试图取消它:

worksheet.Cells["A1"].Formula = null;

希望它会删除某个单元格上的验证,但它无效。

我也试过

var val = worksheet.DataValidations.AddListValidation("A2:A");

指定起始行号但生成的Excel文件已损坏。

对此有任何帮助吗?

2 个答案:

答案 0 :(得分:9)

ExcelCellBase有一个适当的扩展方法来从范围中获取地址字符串:

public static string GetAddress(int FromRow, int FromColumn, int ToRow, int ToColumn)

ExcelPackage有一个公共const MaxRows(1048576),您可以将其用于ToRow参数。

根据你的情况把它们放在一起:

var range = ExcelRange.GetAddress(2, 1, ExcelPackage.MaxRows, 1);
var val = worksheet.DataValidations.AddListValidation(range);

答案 1 :(得分:1)

AFAIK无法在"第2行到无穷大"的优秀范围内设置范围。不幸。所以类似于" A2:A"不管用。

要进行演示,请尝试使用验证列表手动在Excel中创建工作表并保存(与代码无关)。在所有A列上设置val列表,然后单击A1并仅从中删除列表。如果你然后将xlsx重命名为.zip,打开它,然后查看sheet1.xml文件,你会看到:

<dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="A2:A1048576">
    <formula1>"Male,Female"</formula1>
</dataValidation>

请注意sqref。基本上,excel将范围从A2设置为excel 2007格式的最大行数1,048,576。所以没有理由你不能这样做。