发生情景:
最近使用到了模板导出功能,最开始使用的是hutool的POI工具,但是做下拉列表的时候,addSelect方法报错;
问题:
Excel在添加自定义下拉数据的时候,输入内容不能大于255个字符,这在做一些简单的下拉选项时没有问题,但是在下拉选项数据量过大时,就得换一种方式了——即‘从单元格选择下拉选项’,但是在hutool的官网API手册中未发现此内方法,所以转战POI
解决方案:
在创建Excel时新建一个sheet页, 将需要下拉的数据写到新建的sheet页中, 然后再对所需列设置下拉单元格即可;话不多说,下面贴代码。
代码:
- maven引入POI的包,注意两个包的版本需一致,不然会报错。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
2.在你的Excel工具类中添加下面两个方法
/**
* 设置下拉框数据
* @param wb 表格对象
* @param typeName 要渲染的sheet名称
* @param values 下拉框的值
* @param col 下拉列的下标
* @author Hower Wong
* @date 2022年5月27日
*/
public static void setDropDownBox(XSSFWorkbook wb, String typeName, String[] values, Integer col) {
//获取所有sheet页个数
int sheetTotal = wb.getNumberOfSheets();
//处理下拉数据
if (values != null && values.length != 0) {
//新建一个sheet页
String hiddenSheetName = "hiddenSheet";
XSSFSheet hiddenSheet = wb.getSheet(hiddenSheetName);
if (hiddenSheet == null) {
hiddenSheet = wb.createSheet(hiddenSheetName);
sheetTotal++;
}
// 获取数据起始行
int startRowNum = hiddenSheet.getLastRowNum() + 1;
int endRowNum = startRowNum;
//写入下拉数据到新的sheet页中
for (int i = 0; i < values.length; i++)
hiddenSheet.createRow(endRowNum++).createCell(0).setCellValue(values[i]);
//将新建的sheet页隐藏掉
wb.setSheetHidden(sheetTotal - 1, true);
//获取新sheet页内容
String strFormula = hiddenSheetName + "!$A$" + ++startRowNum + ":$A$" + endRowNum;
// 设置下拉
XSSFSheet mainSheet = wb.getSheet(typeName);
mainSheet.addValidationData(SetDataValidation(wb, strFormula, 1, 65535, col, col));
}
}
/**
* 返回类型 DataValidation
* @param wb 表格对象
* @param strFormula formula
* @param firstRow 起始行
* @param endRow 终止行
* @param firstCol 起始列
* @param endCol 终止列
* @return 返回类型 DataValidation
*/
public static DataValidation SetDataValidation(Workbook wb, String strFormula, int firstRow, int endRow, int firstCol, int endCol) {
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
DataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) wb.getSheet("typelist"));
DataValidationConstraint formulaListConstraint = dvHelper.createFormulaListConstraint(strFormula);
return dvHelper.createValidation(formulaListConstraint, regions);
}
3.在你的代码中使用方法即可
以上POI对设置下拉选项的工具方法,希望对大家有所帮助!