2.6.8 用NPOI操作EXCEL--生成下拉列表

      上一节我们讲了简单的数据有效性验证,这一节我们学习一下数据有效性的另一个应用--下拉列表。在Excel中,并没有类似Web中的下拉控件,其下拉效果是通过数据有效性来实现的。设置步骤为:
(1)选定一个要生成下拉列表的区域;
(2)设置数据有效性为序列,并在来源中填充可选下拉的值,用“,”隔开(如图)。

对应的效果为:


同样,利用NPOI代码也可以实现上面的效果:
HSSFSheet sheet1 = hssfworkbook.CreateSheet("Sheet1");

CellRangeAddressList regions 
= new CellRangeAddressList(06553500);
DVConstraint constraint 
= DVConstraint.CreateExplicitListConstraint(new string[] { "itemA""itemB""itemC" });
HSSFDataValidation dataValidate 
= new HSSFDataValidation(regions, constraint);
sheet1.AddValidationData(dataValidate);
下面对代码作一下简要说明:
先设置一个需要提供下拉的区域,关于CellRangeAddressList构造函数参数的说明请参见上一节
CellRangeAddressList regions = new CellRangeAddressList(06553500);
然后将下拉项作为一个数组传给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(06553500);

DVConstraint constraint 
= DVConstraint.CreateFormulaListConstraint("dicRange");
HSSFDataValidation dataValidate 
= new HSSFDataValidation(regions, constraint);
sheet1.AddValidationData(dataValidate);
执行这段代码,生成的Excel效果如下:

在名称管理器中会发现有一个名为"dicRange"的名称,指向"ShtDictionary!$A1:$A3"的下拉项区域:

在数据有效性中会发现来源变成了"=dicRange",指向上面定义的名称。而不是以前的"itemA,itemB,itemC":

 

返回目录

 

posted @ 2009-09-24 00:07  atao.xiang  阅读(19786)  评论(3编辑  收藏  举报