需要自定义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或数字值,则此方法似乎存在问题 – 请参阅下面的注释。 因此使用CELL
function似乎不是最好的方法。
但是,如果单元格格式被明确设置为(更灵活)的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#中。