需要自定义validation(date+特定的文本)在Excel中生成使用C#

我期待有一个使用C#生成的Excel表格中的validation,以便它允许Excel数据单元中的date值或文本“火车”。 我发现XlDVType.xlValidateDate用于validation单元格中的date, XlDVType.xlValidateList允许使用文本值。 但是我想要两者的组合,用户应该能够在单元格中inputdate或特定文本。 这可以使用XlDVType.xlValidateCustom来完成XlDVType.xlValidateCustom

任何帮助,将不胜感激。

我想要两者的组合,用户应该能够在单元格中inputdate或特定文本。

下面的代码片段为您的工作表中的单元格A1设置所需的validation:

 Excel.Range range = xlWorkSheet.Range["A1"]; range.ClearFormats(); range.Validation.Delete(); range.Validation.Add(Excel.XlDVType.xlValidateCustom, Formula1: "=OR(EXACT(LEFT(CELL(\"format\",A1)),\"D\"),EXACT(A1,\"train\"))"); 

最复杂的部分是实际validation公式。 它使用以下function:

EXACT(cell,string)将一个单元格的内容与一个文字string进行比较,只有当它们完全相同时才返回TRUE

CELL("format",cell)返回包含指定单元格的代码,其中date的代码始终以D开头。 有关CELL Office帮助,请参阅所有可能的代码的说明和列表。 这段代码只看第一个字符,为了将内容格式化为某种date,它必须是D

LEFT(text,count)返回LEFT(text,count)中最左边的count字符, count默认为1.在这种情况下,如果内容是某种date,则返回TRUE

OR(logical1, logical2)返回logical1 OR logical2 ,如果内容是date或者完全等于string"train" OR(logical1, logical2) TRUE

这个解决scheme还不是理想的,因为A1被硬编码到公式中。 这里有一个使用INDIRECT的方法。 例如,如果您想一次将validation应用于整个单元格范围,则可能需要这样做。 在这种情况下,硬编码的A1需要被INDIRECT("RC",FALSE)替代,这是指示当前shell的机制。 您可以将其作为INDIRECT("R"&ROW()&"C"&COLUMN(),FALSE)的快捷方式进行读取。

通过这种调整,他最后一行代码看起来像这样(在Excel中testing,但不是来自C#):

 range.Validation.Add(Excel.XlDVType.xlValidateCustom, Formula1: "=OR(EXACT(LEFT(CELL(\"format\",INDIRECT(\"RC\",FALSE))),\"D\"),EXACT(INDIRECT(\"RC\",FALSE),\"train\"))" 

更新

正如OP所指出的那样,如果首先将一个dateinput到单元格中,然后将其更改为不正确的string或数字值,则此方法似乎存在问题 – 请参阅下面的注释。 因此使用CELLfunction似乎不是最好的方法。

但是,如果单元格格式被明确设置为(更灵活)的Text格式,则可以使用以下行进行validation:

 range.Validation.Delete(); range.NumberFormat = "Text"; range.Validation.Add(Excel.XlDVType.xlValidateCustom, Formula1: =OR(ISNUMBER(DATEVALUE(INDIRECT(\"RC\",FALSE))),EXACT(INDIRECT(\"RC\",FALSE),\"train\")); 

再次在Excel中testing,但不是从C#中。