poi实现excel下拉框级联

本文深入探讨了如何使用POI库在Excel中实现下拉框的级联功能,包括具体实现步骤、代码示例及原理解释。详细介绍了在Java后台生成带有级联下拉框的Excel文件的方法,适用于需要在电子表格中实现复杂数据筛选与联动的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【实现思路】

首先我们来看一下Excel中是怎么实现下拉框的级联的:

1. 假设我们的Excel有两个sheet,第一个sheet需要有两个下拉框:地市、区县——其中区县作为地市的二级下拉框级联。下面是具体实现步骤:



2. 首先我们在“数据字典”这个sheet页中的B列为地市下拉框提供数据:



3. 然后我们继续在E列为区县的下拉框提供数据:(注意是所有的数据)



4. 下拉框数据准备好之后,我们需要在名称管理器中创建所谓的“名称”:



地市下拉框创建名称:打开名称管理器,点击“新建”按钮,输入名称为“city”,引用的位置选择B列我们为地市下拉框提供的数据:



然后为区县下拉框创建名称:继续新建名称,名称起名为地市下拉框的第一个值“江苏”,引用的位置为E列中属于江苏的数据



继续新建名称,名称起名为地市下拉框的第二个值“宿迁”,引用位置为E列中属于宿迁的数据



如此反复,直到所有的地市名称与它所对应的区县数据关联起来。


5. 回到第一个sheet页中,选中需要添加“地市”下拉框的单元格


点击“数据”选项卡中的“数据有效性”



允许一项中选择“序列”,来源中如图填写,与city名称关联起来



点击“确定”,我们可以看到地市的下拉框已经加上了:



6. 然后选中需要添加区县下拉框的单元格,点击“数据有效性”


允许一项选择“序列”,来源我们输入“INDIRECT”,后面括号中填写级联的父级下拉框,即这一行中的地市名称那个单元格



点击确定,级联工作至此完成


POI实现】

有了Excel的实现方式,我们可以用同样的方式,在java后台生成这样的带有级联下拉框的EXCEL

我们准备如下方法:

在名称管理器中创建名称的方法:

  1. /** 
  2.  * 创建名称 
  3.  * @param wb 
  4.  * @param name 
  5.  * @param expression 
  6.  * @return 
  7.  */  
  8. public static HSSFName createName(HSSFWorkbook wb, String name, String expression){  
  9.     HSSFName refer = wb.createName();  
  10.     refer.setRefersToFormula(expression);  
  11.     refer.setNameName(name);  
  12.     return refer;  
  13. }  
	/**
	 * 创建名称
	 * @param wb
	 * @param name
	 * @param expression
	 * @return
	 */
	public static HSSFName createName(HSSFWorkbook wb, String name, String expression){
		HSSFName refer = wb.createName();
		refer.setRefersToFormula(expression);
		refer.setNameName(name);
		return refer;
	}

设置数据有效性的方法:

  1. /** 
  2.  * 设置数据有效性(通过名称管理器级联相关) 
  3.  * @param name 
  4.  * @param firstRow 
  5.  * @param endRow 
  6.  * @param firstCol 
  7.  * @param endCol 
  8.  * @return 
  9.  */  
  10. public static HSSFDataValidation setDataValidation(String name, int firstRow, int endRow, int firstCol, int endCol){  
  11.     //设置下拉列表的内容   
  12.     log.info("起始行:" + firstRow + "___起始列:" + firstCol + "___终止行:" + endRow + "___终止列:" + endCol);  
  13.     //加载下拉列表内容   
  14.     DVConstraint constraint = DVConstraint.createFormulaListConstraint(name);  
  15.     // 设置数据有效性加载在哪个单元格上。   
  16.     // 四个参数分别是:起始行、终止行、起始列、终止列   
  17.     CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);  
  18.     // 数据有效性对象   
  19.     HSSFDataValidation data_validation = new HSSFDataValidation(regions, constraint);  
  20.     return data_validation;  
  21. }  
	/**
	 * 设置数据有效性(通过名称管理器级联相关)
	 * @param name
	 * @param firstRow
	 * @param endRow
	 * @param firstCol
	 * @param endCol
	 * @return
	 */
	public static HSSFDataValidation setDataValidation(String name, int firstRow, int endRow, int firstCol, int endCol){
		//设置下拉列表的内容
		log.info("起始行:" + firstRow + "___起始列:" + firstCol + "___终止行:" + endRow + "___终止列:" + endCol);
		//加载下拉列表内容
		DVConstraint constraint = DVConstraint.createFormulaListConstraint(name);
		// 设置数据有效性加载在哪个单元格上。
		// 四个参数分别是:起始行、终止行、起始列、终止列
		CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
		// 数据有效性对象
		HSSFDataValidation data_validation = new HSSFDataValidation(regions, constraint);
		return data_validation;
	}

有了这两个方法之后,我们在程序中对所有数据都写入完成之后,进行如下操作:


  1. //为地市下拉框创建名称   
  2. POIExcelUtil.createName(wb, "city""数据字典!$B$2:$B$"+rowcity);  
  3. //为地市下拉框设置数据有效性   
  4. HSSFDataValidation valicity = POIExcelUtil.setDataValidation("city"2, row-166);  
	//为地市下拉框创建名称
	POIExcelUtil.createName(wb, "city", "数据字典!$B$2:$B$"+rowcity);
	//为地市下拉框设置数据有效性
	HSSFDataValidation valicity = POIExcelUtil.setDataValidation("city", 2, row-1, 6, 6);

  1. <SPAN style="WHITE-SPACE: pre"> </SPAN>//为区县下拉框创建名称   
  2.     POIExcelUtil.createName(wb, cityName, "数据字典!$E$"+tempcoun+":$E$"+rowcoun);  
	//为区县下拉框创建名称
	POIExcelUtil.createName(wb, cityName, "数据字典!$E$"+tempcoun+":$E$"+rowcoun);


  1. <SPAN style="WHITE-SPACE: pre"> </SPAN>//为区县下拉框设置数据有效性,由于区县的下拉框是根据本行的地市单元格级联,所以需要循环加入   
  2.     for(int i = 2;i<row;i++){  
  3.         HSSFDataValidation valicounty = POIExcelUtil.setDataValidation("INDIRECT(G"+(i+1)+")", i, i, 77);  
  4.         sheet.addValidationData(valicounty);  
  5.     }  
	//为区县下拉框设置数据有效性,由于区县的下拉框是根据本行的地市单元格级联,所以需要循环加入
	for(int i = 2;i<row;i++){
		HSSFDataValidation valicounty = POIExcelUtil.setDataValidation("INDIRECT(G"+(i+1)+")", i, i, 7, 7);
		sheet.addValidationData(valicounty);
	}

所以,利用POI实现Excel下拉框的级联并不困难,只要我们明白Excel下拉框的实现原理,再用POI来实现其实很简单。


实现多个单元格下拉框级联最常见的方式是使用数据验证和VLOOKUP函数。以下是一个通用的Java代码实现示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelDropdownCascadeExample { public static void main(String[] args) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 第一列下拉框数据 String[] column1Values = new String[]{"A1", "A2", "A3", "A4"}; // 第一列数据验证 DataValidationHelper validationHelper = sheet.getDataValidationHelper(); CellRangeAddressList column1RangeAddressList = new CellRangeAddressList(1, 100, 0, 0); DataValidationConstraint column1Constraint = validationHelper.createExplicitListConstraint(column1Values); DataValidation column1Validation = validationHelper.createValidation(column1Constraint, column1RangeAddressList); sheet.addValidationData(column1Validation); // 第二列下拉框数据 String[] column2ValuesA1 = new String[]{"B1", "B2", "B3"}; String[] column2ValuesA2 = new String[]{"C1", "C2", "C3"}; String[] column2ValuesA3 = new String[]{"D1", "D2", "D3"}; String[] column2ValuesA4 = new String[]{"E1", "E2", "E3"}; // 第二列数据验证 CellRangeAddressList column2RangeAddressList = new CellRangeAddressList(1, 100, 1, 1); DataValidationConstraint column2Constraint = validationHelper.createFormulaListConstraint("INDIRECT($A1&\"_values\")"); DataValidation column2Validation = validationHelper.createValidation(column2Constraint, column2RangeAddressList); sheet.addValidationData(column2Validation); // 第一列对应的下拉框数据 Name column2ValuesA1Name = workbook.createName(); column2ValuesA1Name.setNameName("A1_values"); column2ValuesA1Name.setRefersToFormula("Sheet1!$G$1:$G$3"); sheet.createRow(0).createCell(6).setCellValue(column2ValuesA1[0]); sheet.createRow(1).createCell(6).setCellValue(column2ValuesA1[1]); sheet.createRow(2).createCell(6).setCellValue(column2ValuesA1[2]); Name column2ValuesA2Name = workbook.createName(); column2ValuesA2Name.setNameName("A2_values"); column2ValuesA2Name.setRefersToFormula("Sheet1!$H$1:$H$3"); sheet.createRow(0).createCell(7).setCellValue(column2ValuesA2[0]); sheet.createRow(1).createCell(7).setCellValue(column2ValuesA2[1]); sheet.createRow(2).createCell(7).setCellValue(column2ValuesA2[2]); Name column2ValuesA3Name = workbook.createName(); column2ValuesA3Name.setNameName("A3_values"); column2ValuesA3Name.setRefersToFormula("Sheet1!$I$1:$I$3"); sheet.createRow(0).createCell(8).setCellValue(column2ValuesA3[0]); sheet.createRow(1).createCell(8).setCellValue(column2ValuesA3[1]); sheet.createRow(2).createCell(8).setCellValue(column2ValuesA3[2]); Name column2ValuesA4Name = workbook.createName(); column2ValuesA4Name.setNameName("A4_values"); column2ValuesA4Name.setRefersToFormula("Sheet1!$J$1:$J$3"); sheet.createRow(0).createCell(9).setCellValue(column2ValuesA4[0]); sheet.createRow(1).createCell(9).setCellValue(column2ValuesA4[1]); sheet.createRow(2).createCell(9).setCellValue(column2ValuesA4[2]); FileOutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); workbook.close(); } } ``` 在这个示例中,我们使用了Apache POI库来创建一个Excel文档,并在第一列添加了一个下拉框,用于选择A1,A2,A3或A4。在第二列中,我们使用了VLOOKUP函数来根据第一列的选择动态更新下拉框数据。我们还使用了命名区域来定义每个下拉框的数据范围。 请注意,这个示例中的代码仅仅是一个通用的实现,真正的实现可能会因为具体的业务需求而有所不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值