Java 导出Excel增加下拉框选项

 更新时间:2022年04月28日 16:50:59   作者:小小小LIN子  
这篇文章主要介绍了Java 导出Excel增加下拉框选项,excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项,下文具体的操作详情,需要的小伙伴可以参考一下

excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项

选项较少(一般少于5个):

private static DataValidation setFewDataValidation(Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {
    DataValidationHelper helper = sheet.getDataValidationHelper();
    //加载下拉列表内容
    DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);
    constraint.setExplicitListValues(textList);
    //设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
    CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
    //数据有效性对象
    return helper.createValidation(constraint, regions);
}

选项较多

创建隐藏工作簿:

Sheet sheetHidden = wb.createSheet("Sheet2");
wb.setSheetHidden(1, true);

每一个列表占用一列

当然也可以每个列表使用一张工作簿,只用第一列。 这里是使用一个工作簿使用每个列,先26个字母,一般够用了

String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
for (int j = 0; j < dataList.size(); j++) {
    if (index == 0) { //第1个下拉选项,直接创建行、列
        row = sheetHidden.createRow(j); //创建数据行
        //      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
        row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值
    } else { //非第1个下拉选项
        int rowCount = sheetHidden.getLastRowNum();
        if (j <= rowCount) { //前面创建过的行,直接获取行,创建列
            //获取行,创建列
            sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值

        } else { //未创建过的行,直接创建行、创建列
            //  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
            //创建行、创建列
            sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
        }
    }
}

index 代表第几个下拉框,也就是在隐藏工作簿的第几列,dataList表示下拉框的内容

创建公式:

String strFormula = "Sheet2!$" + arr[index] + "$1:$" + arr[index] + "$" + dataList.size();

Sheet2第A1到A5000作为下拉列表来源数据

xls和xlsx生成下拉框的选项不一样

private static DataValidation setMoreDataValidation(Workbook wb, Sheet sheet, String strFormula, int startRow, int endRow, int startColumn, int endColumn) {

    DataValidation dataValidation;
    // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
    CellRangeAddressList regions = new CellRangeAddressList(startRow, endRow, startColumn, endColumn);
    if (wb instanceof XSSFWorkbook) {
        //获取新sheet页内容
        XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
        // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
        // 数据有效性对象
        DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);
        dataValidation = help.createValidation(constraint, regions);
        dataValidation.setSuppressDropDownArrow(true);
        dataValidation.setShowErrorBox(true);
    } else {
        // 设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
        DVConstraint constraint = DVConstraint.createFormulaListConstraint(strFormula);
        dataValidation = new HSSFDataValidation(regions, constraint);
        dataValidation.setSuppressDropDownArrow(false);
    }
    dataValidation.setEmptyCellAllowed(true);
    dataValidation.setShowPromptBox(true);
    dataValidation.createErrorBox("Error", "请选择下拉框中的数据");
    dataValidation.createPromptBox("提示", "只能选择下拉框里面的数据");
    return dataValidation;

}

加入工作簿:

sheet.addValidationData()

完整代码:

private static void setValidationDate(Workbook wb, Sheet sheet, List<DataValidationCell> dataValidationCellList) {
    if (dataValidationCellList.isEmpty()) {
        return;
    }
    String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
    int index = 0;
    Row row;
    Sheet sheetHidden = wb.createSheet("Sheet2");
    wb.setSheetHidden(1, true);
    for (DataValidationCell dataValidationCell : dataValidationCellList) {
        List<String> dataList = dataValidationCell.getDataList();
        if (CollectionUtils.isEmpty(dataList)) {
            continue;
        }
        if (dataList.size() <= 5) {
            sheet.addValidationData(setFewDataValidation(sheet, dataList.toArray(new String[0]),
                    dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),
                    dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //超过255个报错
        } else {
            //String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作为下拉列表来源数据
            String strFormula = "Sheet2!$" + arr[index] + "$1:$" + arr[index] + "$" + dataList.size(); //Sheet2第A1到A5000作为下拉列表来源数据
            sheet.addValidationData(setMoreDataValidation(wb, sheet, strFormula,
                    dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),
                    dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //下拉列表元素很多的情况
            //2、生成sheet2内容
            for (int j = 0; j < dataList.size(); j++) {
                if (index == 0) { //第1个下拉选项,直接创建行、列
                    row = sheetHidden.createRow(j); //创建数据行
                    //      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
                    row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值
                } else { //非第1个下拉选项
                    int rowCount = sheetHidden.getLastRowNum();
                    if (j <= rowCount) { //前面创建过的行,直接获取行,创建列
                        //获取行,创建列
                        sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
                    } else { //未创建过的行,直接创建行、创建列
                        //  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
                        //创建行、创建列
                        sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
                    }
                }
            }
            index++;
        }
    }
}
public static class DataValidationCell{
    private int startRow;
    private int endRow;
    private int startColumn;
    private int endColumn;
    private List<String> dataList;
}

到此这篇关于Java 导出Excel增加下拉框选项的文章就介绍到这了,更多相关Java 增加下拉框内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java构建菜单树的实现示例

    Java构建菜单树的实现示例

    本文主要介绍了Java构建菜单树的实现示例,像一级菜单,二级菜单,三级菜单甚至更多层级的菜单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java修改Integer变量值遇到的问题及解决

    Java修改Integer变量值遇到的问题及解决

    这篇文章主要介绍了Java修改Integer变量值遇到的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Springboot打包成jar发布的操作方法

    Springboot打包成jar发布的操作方法

    打包的方式有打包成jar包或者打包成war包发布,区别在于jar包内置了tomcat、netty等服务器,更改只需要修改pom.xml的坐标即可,war不内置服务器,需要上传到服务器tomcat解压后运行,本文分析Springboot打包成jar发布,感兴趣的朋友一起看看吧
    2023-02-02
  • 使用InputStream的available()能否用来判断当前流是否读取到文件

    使用InputStream的available()能否用来判断当前流是否读取到文件

    这篇文章主要介绍了使用InputStream的available()能否用来判断当前流是否读取到文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • java操作excel导入导出的3种方式

    java操作excel导入导出的3种方式

    项目需要,要实现一个导入导出excel的功能,于是任务驱动着我学习到了POI、easypoi和easyexcel这3个java操作Excel的工具,下面这篇文章主要给大家介绍了关于java操作excel导入导出的3种方式,需要的朋友可以参考下
    2023-05-05
  • Java CountDownLatch计数器与CyclicBarrier循环屏障

    Java CountDownLatch计数器与CyclicBarrier循环屏障

    CountDownLatch是一种同步辅助,允许一个或多个线程等待其他线程中正在执行的操作的ASET完成。它允许一组线程同时等待到达一个共同的障碍点
    2023-04-04
  • 详细讲述Java中的对象转型

    详细讲述Java中的对象转型

    在本篇文章里我们给大家详细分享了关于Java中的对象转型的知识点内容,有兴趣的朋友们学习下。
    2018-10-10
  • Spring-cloud 服务发现与消费(以ribbon为例)

    Spring-cloud 服务发现与消费(以ribbon为例)

    这篇文章主要介绍了Spring-cloud 服务发现与消费(以ribbon为例),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • java编程队列数据结构代码示例

    java编程队列数据结构代码示例

    这篇文章主要介绍了java编程队列数据结构代码示例,简单介绍了队列的相关基础知识,然后通过实例向大家展示其实现方法,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java图片处理开源框架Thumbnailator

    Java图片处理开源框架Thumbnailator

    这篇文章主要为大家详细介绍了Java图片处理开源框架Thumbnailator的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论