poi设置下拉列表报错?

新手上路,请多包涵

前端请求文件模板,代码生成excel模板。其中有一列数据要做成下拉的模式。
功能也实现了。
但是如果下拉列表的下拉项过多。下载出的文件模板,下拉项点击无法展示出来。20多个下拉选项是可以正确下拉的,40多个就不行了。这个如果解决??

            //下拉选项
            String[] departList = list.subList(0,35).stream().map(v->{
                return v.getDepartName();
            }).distinct().toArray(String[]::new);
            //设置下拉的选项
            XSSFDataValidationHelper helper = new XSSFDataValidationHelper(sheet);
            DataValidationConstraint constraint = helper.createExplicitListConstraint(departList);
            //设置影响的行和列
            CellRangeAddressList addressList = new CellRangeAddressList(1, 300, 2, 2);
            //设置校验
            DataValidation validation = helper.createValidation(constraint, addressList);
            validation.setSuppressDropDownArrow(true);
            validation.setShowErrorBox(true);
            validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
            validation.createErrorBox("提示","部门不存在!");
            sheet.addValidationData(validation);
阅读 580
avatarAI BotBETA

这个问题可能是由于数据验证的行和列范围设置不正确导致的。在代码中,您设置了数据验证的行范围为1到300,列范围为2到2。这可能意味着,如果您的Excel表格的行或列超过这个范围,那么下拉列表将无法正常工作。

解决方案是将数据验证的行和列范围设置为包含所有需要数据验证的单元格。例如,如果您的Excel表格的行和列范围都大于300,那么您需要将行和列范围设置得更大一些。

此外,数据验证的错误提示信息也可能需要调整。在代码中,您设置了一个名为"提示"的错误提示框,并显示"部门不存在!"的信息。如果下拉列表无法正常工作,您可以尝试修改错误提示信息,以帮助用户更好地理解问题所在。

以下是修改后的代码示例:

//下拉选项
String[] departList = list.subList(0,35).stream().map(v->{
    return v.getDepartName();
}).distinct().toArray(String[]::new);
//设置下拉的选项
XSSFDataValidationHelper helper = new XSSFDataValidationHelper(sheet);
DataValidationConstraint constraint = helper.createExplicitListConstraint(departList);
//设置影响的行和列
CellRangeAddressList addressList = new CellRangeAddressList(1, sheet.getLastRowNum(), 2, 2);
//设置校验
DataValidation validation = helper.createValidation(constraint, addressList);
validation.setSuppressDropDownArrow(true);
validation.setShowErrorBox(true);
validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
validation.createErrorBox("提示","部门不存在!");
sheet.addValidationData(validation);

在这个示例中,我们将数据验证的行和列范围设置为从1到sheet.getLastRowNum()和从2到2,这样就可以覆盖所有需要数据验证的单元格了。

1 个回答

XSSFSheet refSheet = workbook.createSheet("refSheet");
for (int i = 0; i < departList.length; i++) {
    XSSFRow row = refSheet.createRow(i);
    XSSFCell cell = row.createCell(0);
    cell.setCellValue(departList[i]);
}

String formula = "refSheet!$A$1:$A$" + departList.length;
DataValidationConstraint constraint = helper.createFormulaListConstraint(formula);
// ...其余设置相同
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题