如何在MS Excel单元格中使用C#添加数字validation

我的目标是限制用户只能在MS Excel单元格中input1到100之间的值。

我以编程方式生成Excel文件,但是当我添加上面的validationexception是Exception from HRESULT: 0x800A03ECexception引发Exception from HRESULT: 0x800A03EC

我写的代码如下:

 int[] arr = {1,100}; ExcelApp.get_Range(col1, col2).Cells.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation, Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, arr, Type.Missing); 

在上面的代码中, ExcelAppMicrosoft.Office.Interop.Excel.ApplicationClass一个对象

任何帮助真的很感激。

在添加另一个之前,您需要删除单元格validation程序。 否则,您将看到validationexception从HRESULT:0x800A03EC引发为exception

 ExcelApp.get_Range("A1").Cells.Validation.Delete(); ExcelApp.get_Range("A1").Cells.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation, Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, delimitedString1To100, Type.Missing); 

如果没有单元格validation程序存在(即第一次),那么删除不会导致问题,它的安全离开。

编辑/解决scheme:

在代码中的问题是variablesarr包含两个项目1和100.我猜测XLFormatConditionOperator参数xlBetweenValidation.Add的参数误导我们。 要使它适用于xlValidateList的参数XLDVTypeFormula1参数需要包含所有有效值1,2,3 … 100:

 var val = new Random(); var delimitedString1To100 = string.Join(",", (int[])Enumerable.Range(1, 100).ToArray()); for (int i = 1; i < 11; i++) { using (var rnCells = xlApp.Range["A" + i.ToString()].WithComCleanup()) { rnCells.Resource.Value2 = val.Next(100); rnCells.Resource.Cells.Validation.Delete(); rnCells.Resource.Cells.Validation.Add( Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertInformation, Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, delimitedString1To100, Type.Missing); } } 

我不认为你可以传递一个.NET整数数组。 您需要传递一个逗号分隔的string或string引用到工作表范围。 从文档 :

xlValidateListFormula1是必需的; 公式2被忽略。 公式1必须包含以逗号分隔的值列表或对此列表的工作表引用。

例如:

 ExcelApp.get_Range(col1, col2).Cells.Validation.Add( XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertInformation, XlFormatConditionOperator.xlBetween, "1,100" ); 

你想要的可以通过使用macros来完成,macros可以在单元格值变化时分配。 为了运行macrosdynamic创buildExcel的访问http://www.eggheadcafe.com/articles/create_macro_at_runtime_in_dotnet.asp 。 我有时候也是这样实现的,而且也比较容易。