/**
* 單元格添加下拉菜單(不限制菜單可選項個數)<br/>
* [注意:此方法會添加隱藏的sheet,可調用getDataSheetInDropMenuBook方法獲取用戶輸入數據的未隱藏的sheet]<br/>
* [待添加下拉菜單的單元格 -> 以下簡稱:目標單元格]
*
* @param @param workbook
* @param @param tarSheet 目標單元格所在的sheet
* @param @param menuItems 下拉菜單可選項數組
* @param @param firstRow 第一個目標單元格所在的行號(從0開始)
* @param @param lastRow 最後一個目標單元格所在的行(從0開始)
* @param @param column 待添加下拉菜單的單元格所在的列(從0開始)
*/
public static void addDropDownList(XSSFWorkbook workbook, XSSFSheet tarSheet, String[] menuItems, int firstRow,
int lastRow, int column) throws Exception {
if (null == workbook) {
throw new Exception("workbook爲null");
}
if (null == tarSheet) {
throw new Exception("待添加菜單的sheet爲null");
}
// 必須以字母開頭,最長爲31位
String hiddenSheetName = "a" + UUID.randomUUID().toString().replace("-", "").substring(1, 31);
// excel中的"名稱",用於標記隱藏sheet中的用作菜單下拉項的所有單元格
String formulaId = "form" + UUID.randomUUID().toString().replace("-", "");
XSSFSheet hiddenSheet = workbook.createSheet(hiddenSheetName);// 用於存儲 下拉菜單數據
// 存儲下拉菜單項的sheet頁不顯示
workbook.setSheetHidden(workbook.getSheetIndex(hiddenSheet), true);
XSSFRow row = null;
XSSFCell cell = null;
// 隱藏sheet中添加菜單數據
for (int i = 0; i < menuItems.length; i++) {
row = hiddenSheet.createRow(i);
// 隱藏表的數據列必須和添加下拉菜單的列序號相同,否則不能顯示下拉菜單
cell = row.createCell(column);
cell.setCellValue(menuItems[i]);
}
XSSFName namedCell = workbook.createName();// 創建"名稱"標籤,用於鏈接
namedCell.setNameName(formulaId);
namedCell.setRefersToFormula(hiddenSheetName + "!A$1:A$" + menuItems.length);
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(tarSheet);
DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint(formulaId);
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, column, column);
HSSFDataValidation validation = (HSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);// 添加菜單(將單元格與"名稱"建立關聯)
tarSheet.addValidationData(validation);
}