问题产生:DVConstraint.createExplicitListConstraint(String[] listData)
解决问题:使用 DVConstraint.createFormulaListConstraint(hiddenSheet) 建立隐藏域
具体代码:
Sheet sheet1 = workbook.createSheet(sheetName);
int endRow = 50000;
int count=0;
` Set<String> keys = xiala.keySet();
for (String key : keys) {
count++;
String hiddenSheet = "category1Hidden" + key.toString();
//创建隐藏域
HSSFSheet category1Hidden = workbook.createSheet(hiddenSheet);
String values = xiala.get(key);
String[] textList = values.split(",");
for (int i = 0, length = textList.length; i < length; i++) {
// 循环赋值(为了防止下拉框的行数与隐藏域的行数相对应来获取>=选中行数的数组,将隐藏域加到结束行之后)
category1Hidden.createRow(i + endRow).createCell(Integer.parseInt(key)).setCellValue(textList[i]);
}
Name category1Name = workbook.createName();
category1Name.setNameName(hiddenSheet);
category1Name.setRefersToFormula(hiddenSheet + "!A1:A" + (textList.length+endRow));
DVConstraint constraint = DVConstraint.createFormulaListConstraint(hiddenSheet);
//DVConstraint constraint = DVConstraint.createExplicitListConstraint(textList);
CellRangeAddressList regions = new CellRangeAddressList(1, endRow, Integer.parseInt(key), Integer.parseInt(key));
HSSFDataValidation data_validation = new HSSFDataValidation(regions, constraint);
workbook.setSheetHidden(count,true);
((HSSFSheet) sheet1).addValidationData(data_validation);
}``
![控制结尾,防止你在下拉时,下拉list中的数据,会因为单元格变化而缺失数据。控制结束行,在结束行之前都是list所有数据,超过结束行,还是会因单元格变化而缺失数据](https://img-blog.csdnimg.cn/20190521154043793.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMzU2MzQ4,size_16,color_FFFFFF,t_70)