C#excel数据验证下拉列表throwserror

时间:2017-07-27 10:50:44

标签: c# .net excel

我正在尝试使用c#将下拉列表添加到范围。

这是我到目前为止所做的。

 Worksheet ws = PPTAddIn.thisAddin2Obj.Application.ActiveWorkbook.ActiveSheet;
            ws.get_Range("a1").Validation.Delete();
            ws.get_Range("a1").Validation.InCellDropdown = true;
            ws.get_Range("a1").Validation.IgnoreBlank = true;
            ws.get_Range("a1").Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, "opt1,opt2,opt3", Missing.Value);

在第3行代码中抛出异常
来自HRESULT的异常:0x800A03EC

https://nodejs.org/api/https.html

这是堆栈跟踪
   at System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFlags flags,Object target,Int32 [] aWrapperTypes,MessageData&amp; msgData)    在Microsoft.Office.Interop.Excel.Validation.set_InCellDropdown(布尔)    在MS:.ProductionPlanningTool.Excel.Ribbon_PPT.ribbon_signin_Click(Object sender,RibbonControlEventArgs e)在D:\ MidasCloud \ CloudTFS \ ProductionPlanning \ MSP2 \ MS.ProductionPlanningTool.Excel \ UI \ Ribbon_PPT.cs:第1328行    在Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ControlActionRaise(IRibbonControl控件)    在Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ButtonClickCallback(RibbonComponentImpl组件,Object [] args)    在Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.Invoke(RibbonComponentCallback回调,对象[] args)    在Microsoft.Office.Tools.Ribbon.RibbonMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)    在Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.System.Reflection.IReflect.InvokeMember(String name,BindingFlags invokeAttr,Binder binder,Object target,Object [] args,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParameters)< / p>

4 个答案:

答案 0 :(得分:1)

尝试移动你的&#34; .InCellDropDown = true&#34;到代码的末尾。

我的意思是:

 Worksheet ws = PPTAddIn.thisAddin2Obj.Application.ActiveWorkbook.ActiveSheet;
            ws.get_Range("a1").Validation.Delete();
            ws.get_Range("a1").Validation.IgnoreBlank = true;
            ws.get_Range("a1").Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, "opt1,opt2,opt3", Missing.Value);
            ws.get_Range("a1").Validation.InCellDropdown = true;

希望有所帮助。

答案 1 :(得分:1)

命令序列不正确。将Add语句移到Delete语句后面。如果验证不存在,则无法在Validation对象上设置其他值。

Worksheet ws = PPTAddIn.thisAddin2Obj.Application.ActiveWorkbook.ActiveSheet;
ws.get_Range("a1").Validation.Delete();
ws.get_Range("a1").Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, "opt1,opt2,opt3", Missing.Value);
ws.get_Range("a1").Validation.InCellDropdown = true;
ws.get_Range("a1").Validation.IgnoreBlank = true;

旁注:

使用Excel中的宏录制器获取操作的语法。虽然输出是在VBA中,但语法并没有那么不同,你无法解密命令并转换为C#。 VBA足够接近VB.Net,VB到C#转换器将产生可以清理和使用的代码。唯一的问题是宏记录器会广泛使用Selection对象,您应该将其转换为Selection对象所代表的任何内容(很可能是Excel.Range)。您还需要对VB的索引属性进行等效方法调用的修正(即:Range("a1") - &gt; get_Range("a1"))。

修改:我最初没有检查Add语句的语法,但似乎缺少参数。

来自documentation

void Add(
    XlDVType Type,
    Object AlertStyle,
    Object Operator,
    Object Formula1,
    Object Formula2
)

和您的Add信息:

Add(XlDVType.xlValidateList, 
    XlDVAlertStyle.xlValidAlertWarning, 
    "opt1,opt2,opt3", 
    Missing.Value)

您似乎缺少Operator参数。使用宏录制器时,默认值似乎为XlFormatConditionOperator.xlBetween

您还应该定义一个Validation对象,并使用该对象代替ws.get_Range("a1").Validation来设置/调用每个属性/方法。

答案 2 :(得分:0)

试着看看这个,它可能对你有帮助:

(重点关注第2部分 - 限制列表中预定义项目的输入)

https://www.codeproject.com/Tips/1089368/Apply-Data-Validation-to-Excel-Cells-in-Csharp

答案 3 :(得分:0)

感谢大家普遍接受我的回答,但可惜它并没有首先起作用。由于Jayakrishnan在该答案下的注释中正确指出,因此缺少一个参数。因为像我这样的未来访问者可能暂时不会看这些评论,所以我将在此处发布我的代码。我的代码显示了使用命名参数来跳过可选的运算符参数的用法。它还显示了如何将数据验证添加为采用任何字符串列表的函数(我只是事先做一个.join!)。享受。

public void SetDropdownValidation(params string[] values)
{
    string valuesJoined = string.Join(",", values);
    Validation validation = RawRange.Validation;
    validation.Delete();
    validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertWarning, Formula1: valuesJoined, Formula2: Missing.Value);
    validation.InCellDropdown = true;
}

注释

  • 此函数是在类RawRange是类型Range的成员变量的类的上下文中编写的。
  • 可以对这些代码进行调整/使其更灵活,以处理诸如IgnoreBlank之类的东西,但是基本思想在上面