我已经在一个工作表(状态名称列表)上创建了一个表,并将该表命名为“ tblStates”。然后,在第二个工作表上,有一个用于“状态”的列,我想要对这些单元格进行列表验证,其中每个单元格都有一个下拉列表,其中提供了“ tblStates”表中的状态名称。因此,对于第二个工作表中的“状态”列,我创建了一个名为“ tblGeoStates”的表,并在引用“ = tblStates”的列中添加了列表验证。 (我引用了本文/视频,尽管我没有第二个从属列表,但只想做其中的第一部分:Contexture Video)
按照上面链接中的步骤,我已经在Excel中手动执行了这些步骤,并且效果很好,但是,当通过EPPlus对其进行编码时,它是行不通的。每个工作表中的表均已存在并正确命名。列表验证已应用于第二个工作表中的表,并且在tblGeoStates中的每个单元格上都显示一个下拉列表。但是没有显示任何值。
带有tblGeoStates表的工作表2,该表具有引用第一个表的列表验证
当我尝试单击列表验证对话框以将其关闭时,我从Excel收到此验证错误-手动创建的工作簿中均未发生这种情况,并且所有内容看起来都是相同的 >
使用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>
答案 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个字符。