POI在生成excel模板時需要為列添加下拉框,我寫了兩個方法。
@ 方法一:適用任何情況,不受下拉框值數量限制。但是需要通過引用其它列值。
思路大概如下:
1.創建一個隱藏的sheet頁,用於存放下拉框的值。
HSSFSheet listSheet = workBook.createSheet("ShtDictionary");//隱藏的sheet,用於存放下拉框的限定值
2.將下拉框的值放置在隱藏sheet【ShtDictionary】某列
//rows表示下拉框限定值的個數
for(int i = 0 ;i<rows;i++){
String cellValue = ...; listSheet.createRow(i).createCell(0).setCellValue(cellValue); }
3.添加下拉框引用
setHSSFValidation(HSSFSheet sheet,String sheetName, int lastRow,String col, int firstRow, int endRow, int firstCol, int endCol)
@ 自定義方法詳解
/** * 設置某些列的值只能sheet中某列輸入預制的數據,顯示下拉框. * @param HSSFSheet sheet 模板sheet頁(需要設置下拉框的sheet) * @param String sheetName 隱藏的sheet頁,用於存放下拉框的值 (下拉框值對應一列) * @param int lastRow 存放下拉框值的最后一行 * @param String col 存放下拉框值的列名 "A" * @param int firstRow 添加下拉框對應開始行 * @param int endRow 添加下拉框對應結束行 * @param int firstCol 添加下拉框對應開始列 * @param int endCol 添加下拉框對應結束列 * @return HSSFSheet 設置好的sheet. */ public static HSSFSheet setHSSFValidation(HSSFSheet sheet,String sheetName, int lastRow,String col, int firstRow, int endRow, int firstCol, int endCol){ //設置數據有效性加載在哪個單元格上,四個參數分別是:起始行、終止行、起始列、終止列 CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); String cell = "\""+sheetName +"!$"+col+"$1:$"+col+"$"+lastRow+"\""; System.out.println("下拉框列:"+cell); // 這句話是關鍵 引用ShtDictionary 的單元格 DVConstraint constraint = DVConstraint.createFormulaListConstraint("INDIRECT("+cell+ ")"); HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint); sheet.addValidationData(dataValidate); return sheet; }
@ 方法二 :此方法僅僅使用下拉框值不超過232個的情況,優點是簡單。
1.將下拉框的值存放在自定義的一個數組對象中 String[] textList
String[] textlist = ...;//下拉框顯示的內容
2.添加下拉框引用
setHSSFValidation(HSSFSheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol);
@ setHSSFValidation
/** * 設置某些列的值只能輸入預制的數據,顯示下拉框. * @param HSSFSheet sheet 模板sheet頁(需要設置下拉框的sheet) * @param String[] textlist 下拉框顯示的內容 * @param int firstRow 添加下拉框對應開始行 * @param int endRow 添加下拉框對應結束行 * @param int firstCol 添加下拉框對應開始列 * @param int endCol 添加下拉框對應結束列 * @return HSSFSheet 設置好的sheet. */ public static HSSFSheet setHSSFValidation(HSSFSheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol){ // 設置數據有效性加載在哪個單元格上,四個參數分別是:起始行、終止行、起始列、終止列 CellRangeAddressList regions = new CellRangeAddressList(firstRow,endRow, firstCol, endCol); // 加載下拉列表內容 DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist); // 數據有效性對象 HSSFDataValidation data_validation_list = new HSSFDataValidation(regions, constraint); sheet.addValidationData(data_validation_list); return sheet; }
@ 數據有效性對象【HSSFDataValidation】的相關方法:
// 設置提示內容,標題,內容
void org.apache.poi.hssf.usermodel.HSSFDataValidation.createPromptBox(String title, String text);

