上一節我們講了簡單的資料有效性驗證,這一節我們學習一下資料有效性的另一個應用--下拉式清單。在Excel中,並沒有類似Web中的下拉控制項,其下拉效果是通過資料有效性來實現的。設定步驟為:
(1)選定一個要產生下拉式清單的地區;
(2)設定資料有效性為序列,並在來源中填充可選下拉的值,用“,”隔開()。
對應的效果為:
同樣,利用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);
執行這段代碼,產生的Excel效果如下:
在名稱管理器中會發現有一個名為"dicRange"的名稱,指向"ShtDictionary!$A1:$A3"的下拉項地區:
在資料有效性中會發現來源變成了"=dicRange",指向上面定義的名稱。而不是以前的"itemA,itemB,itemC":
返回目錄