EPPlus问题从另一个电子表格上的表创建列表验证

时间:2018-12-03 19:21:01

标签: excel excel-formula epplus

我已经在一个工作表(状态名称列表)上创建了一个表,并将该表命名为“ tblStates”。然后,在第二个工作表上,有一个用于“状态”的列,我想要对这些单元格进行列表验证,其中每个单元格都有一个下拉列表,其中提供了“ tblStates”表中的状态名称。因此,对于第二个工作表中的“状态”列,我创建了一个名为“ tblGeoStates”的表,并在引用“ = tblStates”的列中添加了列表验证。 (我引用了本文/视频,尽管我没有第二个从属列表,但只想做其中的第一部分:Contexture Video

按照上面链接中的步骤,我已经在Excel中手动执行了这些步骤,并且效果很好,但是,当通过EPPlus对其进行编码时,它是行不通的。每个工作表中的表均已存在并正确命名。列表验证已应用于第二个工作表中的表,并且在tblGeoStates中的每个单元格上都显示一个下拉列表。但是没有显示任何值。

带有tblStates表的工作表1 Worksheet 1 with tblStates table

带有tblGeoStates表的工作表2,该表具有引用第一个表的列表验证 Worksheet 2 with tblGeoStates table

当我尝试单击列表验证对话框以将其关闭时,我从Excel收到此验证错误-手动创建的工作簿中均未发生这种情况,并且所有内容看起来都是相同的

Excel Validation Error

使用EPPlus生成的代码,这些代码将生成每个表,然后在第二个表上进行列表验证。

        // Add Named Table for States column so we can reference it in another sheet
        using (ExcelRange r = ws.Cells[$"B6:B57"])
        {
            ExcelTableCollection tblcollection = ws.Tables;
            ExcelTable table = tblcollection.Add(r, "tblStates");                             
        }

        // Add Named Table for GeoStates column and validation that references tblStates
        using (ExcelRange r = ws.Cells["F:F"]) // also tried "F2:F1048576 so the header isn't included
        {
            ExcelTableCollection tblcollection = ws.Tables;
            ExcelTable table = tblcollection.Add(r, "tblGeoStates");
            table.ShowFilter = false;

            var v1 = r.DataValidation.AddListDataValidation();               
            v1.ShowErrorMessage = true;
            v1.ErrorStyle = ExcelDataValidationWarningStyle.warning;
            v1.ErrorTitle = "An invalid value was entered";
            v1.Error = "Select a value from the list";
            v1.Formula.ExcelFormula = "=tblStates"; // tried w & w/o = sign
        }

我尝试了一些不同的操作,例如是否包含表头或未在表的选定范围内;是否允许空白,是否显示过滤器等。

我已经检查了手动创建的工作簿以及使用EPPlus编程生成的工作簿的基础XML,它们看起来有所不同。

这是EPPlus自动生成的(无效):

<dataValidation sqref="F1:F1048576" errorStyle="warning" error="Select a value from the list" errorTitle="An invalid value was entered" showErrorMessage="1" type="list">
<formula1>tblStates</formula1>
</dataValidation>

这是我手动执行的(并且可以执行):

<dataValidation xr:uid="{895EE9F3-E8D3-45B6-AD98-9A095C448064}" sqref="F1:F1048576" showErrorMessage="1" showInputMessage="1" type="list" allowBlank="1">
<formula1>tblStates</formula1>
</dataValidation>

2 个答案:

答案 0 :(得分:0)

为什么要使用这些表?您可以直接添加范围。

using (ExcelRange r = worksheet.Cells["F:F"])
{
    var v1 = r.DataValidation.AddListDataValidation();
    v1.ShowErrorMessage = true;
    v1.ErrorStyle = ExcelDataValidationWarningStyle.warning;
    v1.ErrorTitle = "An invalid value was entered";
    v1.Error = "Select a value from the list";

    //reference the cells with the states directly
    v1.Formula.ExcelFormula = "B6:B57";

    //or if the data is in another sheet, you can reference that also
    v1.Formula.ExcelFormula = "'WorkSheet 2'!B:B";
}

答案 1 :(得分:0)

我有一个类似的错误,但是问题是由于IExcelDataValidationList.Error值大于255个字符。