如何在MS Excel单元格中使用C#添加数字validation
我的目标是限制用户只能在MS Excel单元格中input1到100之间的值。
我以编程方式生成Excel文件,但是当我添加上面的validationexception是Exception from HRESULT: 0x800A03EC
exception引发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);
在上面的代码中, ExcelApp
是Microsoft.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参数xlBetween
在Validation.Add
的参数误导我们。 要使它适用于xlValidateList的参数XLDVType , Formula1参数需要包含所有有效值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引用到工作表范围。 从文档 :
xlValidateList – Formula1是必需的; 公式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 。 我有时候也是这样实现的,而且也比较容易。