如何用Apache POI在Excel中创建跨工作表依赖下拉列表?(已实现但无选项)
问题分析与修复方案
你的代码存在几个关键问题,导致下拉列表无选项显示:
命名区域被覆盖
你仅创建了一个Name对象,每次调用setNameName都会覆盖之前的命名,最终只有VEGETABLE被保留,CHOICES和ANIMAL都丢失了。每个命名区域需要单独创建Name实例。数据源引用错误
CHOICES应指向表头行(第10行的Animal、Vegetable),而非第11行的动物名称ANIMAL应指向第11行的Lion、Tiger,你错误引用了第12行的蔬菜数据VEGETABLE应指向第12行的Cabbage、Spinach,你错误引用了空的第13行
下拉箭头被隐藏
validation.setSuppressDropDownArrow(true)会隐藏下拉箭头,改为false才能显示箭头并展开选项。
修正后的代码
XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet dataSheet = workbook.createSheet("dataSheet"); // 表头行(一级选项:Animal、Vegetable) Row headerRow = dataSheet.createRow(10); Cell headerCell = headerRow.createCell(0); headerCell.setCellValue("Animal"); headerCell = headerRow.createCell(1); headerCell.setCellValue("Vegetable"); // 动物选项行 Row animalRow = dataSheet.createRow(11); animalRow.createCell(0).setCellValue("Lion"); animalRow.createCell(1).setCellValue("Tiger"); // 蔬菜选项行 Row vegRow = dataSheet.createRow(12); vegRow.createCell(0).setCellValue("Cabbage"); vegRow.createCell(1).setCellValue("Spinach"); // 创建Sheet1 XSSFSheet sheet1 = workbook.createSheet("Sheet1"); // 分别创建三个命名区域,每个命名单独实例化Name // 1. CHOICES:指向表头的一级选项 Name choicesName = workbook.createName(); choicesName.setNameName("CHOICES"); choicesName.setRefersToFormula("dataSheet!$A$10:$B$10"); // 2. ANIMAL:指向动物选项行 Name animalName = workbook.createName(); animalName.setNameName("ANIMAL"); animalName.setRefersToFormula("dataSheet!$A$11:$B$11"); // 3. VEGETABLE:指向蔬菜选项行 Name vegName = workbook.createName(); vegName.setNameName("VEGETABLE"); vegName.setRefersToFormula("dataSheet!$A$12:$B$12"); // 配置Sheet1的下拉验证 DataValidationHelper dvHelper = sheet1.getDataValidationHelper(); // 第一个下拉(A1单元格):选择Animal/Vegetable DataValidationConstraint dvConstraint1 = dvHelper.createFormulaListConstraint("CHOICES"); CellRangeAddressList addressList1 = new CellRangeAddressList(0, 0, 0, 0); DataValidation validation1 = dvHelper.createValidation(dvConstraint1, addressList1); validation1.setSuppressDropDownArrow(false); // 显示下拉箭头 sheet1.addValidationData(validation1); // 第二个下拉(B1单元格):根据A1的选择显示对应选项 DataValidationConstraint dvConstraint2 = dvHelper.createFormulaListConstraint("INDIRECT(UPPER($A$1))"); CellRangeAddressList addressList2 = new CellRangeAddressList(0, 0, 1, 1); DataValidation validation2 = dvHelper.createValidation(dvConstraint2, addressList2); validation2.setSuppressDropDownArrow(false); // 显示下拉箭头 sheet1.addValidationData(validation2);
内容的提问来源于stack exchange,提问作者user19834498
相关产品推荐
相关产品推荐

