Java poi设置下拉的两种方式

最近做到导出功能经常用到,在此记录实现方式,首先导入maven poi 依赖,使用已存在的模板测试

在这里插入图片描述

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.0.0</version>
</dependency>

实现方式一:

手动添加下拉选项,但是这种单元格不能超过255个字符,如果只是简单的下拉数据,可以使用这种方便。

/**
 * 设置下拉框
 *
 * @param sheet    指定sheet页
 * @param values   下拉框的值
 * @param firstRow 起始行号
 * @param lastRow  起始行号
 * @param firstCol 起始列号
 * @param lastCol  终止列号
 * 
 * @author zengwei
 * @email 1014483974@qq.com
 * @date 2021-05-30
 *  
 * 能日赚30的APP试玩平台推荐,亲测有效、
 * (https://mp.weixin.qq.com/s/V5j45WYoyIvFsZbua56RSQ)
 */
public static void setDropDownBox(XSSFSheet sheet, String[] values, Integer firstRow, Integer lastRow, Integer
        firstCol, Integer lastCol) {
    XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
    XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(values);
    CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
    DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
    //这两行设置单元格只能是列表中的内容,否则报错
    validation.setSuppressDropDownArrow(true);
    validation.setShowErrorBox(true);
    sheet.addValidationData(validation);
}

调用方法

/**
 * 生成excel下拉框
 *
 * @author zengwei
 * @email 1014483974@qq.com
 * @date 2021-05-30
 */
public static void main(String[] args) {
    FileOutputStream out = null;
    File file = new File("F://test.xlsx");
    try (XSSFWorkbook wb = new XSSFWorkbook(file)) {
        // 选中指定sheet
        XSSFSheet sheet = wb.getSheetAt(wb.getSheetIndex("sheet1"));
        String[] values = {"blue", "red", "black"};
        setDropDownBox(sheet, values, 1, 100, 0, 0);
        // 写入文件
        String outFile = "F://" + RandomUtil.randomString(10) + ".xlsx";
        out = new FileOutputStream(outFile);
        wb.write(out);
    } catch (InvalidFormatException | IOException e) {
        e.printStackTrace();
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

能日赚30的APP试玩平台推荐,亲测有效

生成的模板效果
在这里插入图片描述

实现方式二:

从单元格选择下拉选项,手动添加下拉选项单元格不能超过255个字符,否则会报A valid formula or a list of values must be less than or equal to 255 characters (including separators).

在这里插入图片描述

我们需要创建一个隐藏的sheet,从隐藏的sheet页获取单元格内容作为下拉选项。

/**
 * 设置下拉框数据
 *
 * @param wb       表格对象
 * @param typeName 要渲染的sheet名称
 * @param values   下拉框的值
 * @param firstCol 起始列号
 * @param lastCol  终止列号
 *
 * @author zengwei
 * @email 1014483974@qq.com
 * @date 2021-05-30
 *
 * 能日赚30的APP试玩平台推荐,亲测有效
 * (https://mp.weixin.qq.com/s/V5j45WYoyIvFsZbua56RSQ)
 */
public void setDropDownBox(XSSFWorkbook wb, String typeName, String[] values, Integer firstCol, Integer lastCol) {
    //获取所有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);
            //写入下拉数据到新的sheet页中
            for (int i = 0; i < values.length; i++) {
                XSSFRow row = hiddenSheet.createRow(i);
                XSSFCell cell = row.createCell(0);
                cell.setCellValue(values[i]);
            }
            //将新建的sheet页隐藏掉
            wb.setSheetHidden(sheetTotal, true);
        }
        //获取新sheet页内容
        String strFormula = hiddenSheetName + "!$A$1:$A$65535";
        XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
        // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
        CellRangeAddressList regions = new CellRangeAddressList(0, 65535, firstCol, lastCol);
        // 数据有效性对象
        DataValidationHelper help = new XSSFDataValidationHelper(hiddenSheet);
        DataValidation validation = help.createValidation(constraint, regions);
        XSSFSheet sheet1 = wb.getSheet(typeName);
        sheet1.addValidationData(validation);
    }

}

调用方法

/**
 * 生成excel下拉框
 *
 * @author zengwei
 * @email 1014483974@qq.com
 * @date 2021-05-30
 */
@Test
public void test() {
    List<FreightTemplate> list = freightTemplateService.list();
    List<String> nameList = list.stream().map(FreightTemplate::getName).collect(Collectors.toList());
    String[] values = Convert.toStrArray(nameList);
    // 导出excel到指定位置
    FileOutputStream out = null;
    File file = new File("F://test.xlsx");
    try (XSSFWorkbook wb = new XSSFWorkbook(file)) {
        // 选中指定sheet
        setDropDownBox(wb, "sheet1", values, 0, 0);
        // 写入文件
        String outFile = "F://" + RandomUtil.randomString(10) + ".xlsx";
        out = new FileOutputStream(outFile);
        wb.write(out);
    } catch (InvalidFormatException | IOException e) {
        e.printStackTrace();
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

生成的模板效果

在这里插入图片描述

能日赚30的APP试玩平台推荐,亲测有效

右键点击sheet,可以看见后面是有隐藏的sheet的,这个隐藏sheet的单元格数据,就是我们下拉显示的数据。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

以上是对excel导出生成下拉框的两种方式的总结,希望能帮助到更多的开发者。

原文地址:https://www.cnblogs.com/shiqiboy3974/p/14829478.html