Excel下拉列表通常都是利用“数据有效性”来实现的,通过“数据有效性”设置,可以让Execl的某一单元格出现下来菜单的效果,那么如何实现excel下拉列表呢?
Excel下拉列表、Excel下拉菜单的第一种方法(数据有效性):
第一步:打开Excel工作薄——>选定某一单元格——>点击上方的“数据(D)”菜单——>点击“有效性(L)”;
第二步:将弹出“数据有效性”窗口,在“设置”选项卡中“有效性条件”下方找到“允许(A)”,将其设置为“序列”——>然后再将“忽略空值(B)”和“提供下拉箭头(I)”两项前面打上勾;
第三步:最后在“来源(S)”中,输入您需要的菜单选项数据,比如,需要设置1、2、3为下拉菜单中的可选项,就在“来源(S)”下方输入“1,2,3”,每一组数据之间必须以英文标点的逗号“,”隔开,不能用中文全角的逗号“,”——>最后点击“确定”退出即可;
补充说明:在“来源(S)”中还可以直接引用某些单元格内的数据作为下拉菜单的可选项,只需要在“来源(S)”下方输入一串代码即可,比如,想要让第一列的单元格A1至A5中的数据作为可选项,就在“来源(S)”下方输入“=$A$1:$A$5”(不含引号,且必须使用英文符号和标点);
Excel下拉列表、Excel下拉菜单的第二种方法(自动生成可选项的范围):
第一步:首先定义可选项数据的范围,也就是说出现在下拉菜单中的选项是哪些数据,这个范围只能是某一行或某一列;使用鼠标框选某一行或某一列的数据——>然后点击上方的“插入”菜单——>点击“名称(N)”——>选择“自定义(D)”;
第二步:将弹出的“自定义名称”窗口,在“在当前工作薄中的名称(W)”下输入“dw”——>点击右边的“添加”——>点击“确定”退出;
第三步:选中要设置Excel下拉列表的单元格后——>点击“有效性”——>在“设置”选项卡中,将“允许(A)”设置为“序列”——>在“来源(S)”下输入“=dw”(不含引号)——>点击“确定”即可;
Excel下拉列表、Excel下拉菜单的第三种方法(筛选):
利用“筛选”功能自动生成Excel下拉选项,采用此方法会将Excel工作薄的某一列中的所有数据都作为下拉菜单中的可选项;
第一步:打开Excel工作薄——>用鼠标框选住需要设置Excel下拉选项的某一行内容(如,单位名称、产品名称、日期、数量这一行);
第二步:然后点击上方的“数据(D)”菜单——>点击“筛选”——>选择“自动筛选”;
采用“自动筛选”方法生产的Excel下拉列表、Excel下拉菜单、Excel下拉选项,会将整个一列的数据都作为可选项被使用;
实例:有如下一份省市数据:省份以及省份所辖地市清单,需要实现多级联动下拉菜单操作,具体操作方式如下所示:
第一步:对各单元格区域进行名称定义
选中A1:A5单元格区域,然后公式——根据所选内容创建——如图设置
PS:分别对B、C、D、E列重复以上操作
第二步:设置省份列的选项
选中G1:G22单元格区域,然后数据——数据有效性
弹出数据有效性设置窗口,然后如图设置
其中来源“=省份”,这里的省份与之前自定义的单元格区域名称是相对应的
省份选项搞定
第三步:设置地市列的选项
选中H1:H22单元格区域,然后数据——数据有效性
在弹出的窗口,设置如下
其中来源=indirect($G1)
PS:indirect函数,返回由文本字符串指定的引用。
地市选项也搞定了,N级操作以此类推
同样,利用NPOI代码也可以实现上面的效果:
HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
CellRangeAddressList regions = new CellRangeAddressList(0, 65535, 0, 0);
DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(new string[] { "itemA", "itemB", "itemC" });
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
sheet1.AddValidationData(dataValidate);
下面对代码作一下简要说明:
先设置一个需要提供下拉的区域,关于CellRangeAddressList构造函数参数的说明请参见上一节:
CellRangeAddressList regions = new CellRangeAddressList(0, 65535, 0, 0);然后将下拉项作为一个数组传给CreateExplicitListConstraint作为参数创建一个约束,根据要控制的区域和约束创建数据有效性就可以了。
但是这样会有一个问题:Excel中允许输入的序列来源长度最大为255个字符,也就是说当下拉项的总字符串长度超过255是将会出错。那么如果下拉项很多的情况下应该怎么处理呢?答案是通过引用的方式。步骤如下:
先创建一个Sheet专门用于存储下拉项的值,并将各下拉项的值写入其中:
HSSFSheet sheet2 = hssfworkbook.CreateSheet("ShtDictionary");
sheet2.CreateRow(0).CreateCell(0).SetCellValue("itemA");
sheet2.CreateRow(1).CreateCell(0).SetCellValue("itemB");
sheet2.CreateRow(2).CreateCell(0).SetCellValue("itemC");然后定义一个名称,指向刚才创建的下拉项的区域:
HSSFName range = hssfworkbook.CreateName();
range.Reference = "ShtDictionary!$A1:$A3";
range.NameName = "dicRange";最后,设置数据约束时指向这个名称而不是字符数组:
HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
CellRangeAddressList regions = new CellRangeAddressList(0, 65535, 0, 0);
DVConstraint constraint = DVConstraint.CreateFormulaListConstraint("dicRange");
HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);
sheet1.AddValidationData(dataValidate);