項目上最近有一個需求,需要導出的excel擁有多個數據有效性校驗的功能,開始是參考了網上的使用POI為Excel添加數據有效性驗證,核心代碼大致如下
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper
.createExplicitListConstraint(explicitListValues);
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);
validation.setSuppressDropDownArrow(true);
validation.setShowErrorBox(true);
sheet.addValidationData(validation);
但是使用過程中,發現一旦有效性List超過255個字符整個Excel就會全部失效的情況,找了很久,參考了網上另外一篇poi導出excel時下拉列表值超過255問題解決方案,
核心代碼如下
XSSFSheet sheet = wb.createSheet(sheetName);
//獲取所有sheet頁個數
int sheetTotal = wb.getNumberOfSheets();
String hiddenSheetName = "hiddenSheet" + sheetTotal;
XSSFSheet hiddenSheet = wb.createSheet(hiddenSheetName);
Row row;
//寫入下拉數據到新的sheet頁中
for (int i = 0; i < selectList.length; i++) {
row = hiddenSheet.createRow(i);
Cell cell = row.createCell(0);
cell.setCellValue(selectList[i]);
}
//獲取新sheet頁內容
String strFormula = hiddenSheetName + "!$A$1:$A$65535"; //hiddenSheetName + ! 定位到用來加載列的新的sheet頁,后面則是A列的1-65535為有效性List條件
XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST,strFormula);
// 設置數據有效性加載在哪個單元格上,四個參數分別是:起始行、終止行、起始列、終止列
CellRangeAddressList regions = new CellRangeAddressList(0,65535, columnIndex, columnIndex);
// 數據有效性對象
DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);
DataValidation validation = help.createValidation(constraint, regions);
sheet.addValidationData(validation);
//將新建的sheet頁隱藏掉
wb.setSheetHidden(sheetTotal, true);
成功解決問題!!!