zoukankan      html  css  js  c++  java
  • 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导出生成下拉框的两种方式的总结,希望能帮助到更多的开发者。

  • 相关阅读:
    C#编码标准--编码习惯
    课程九,课堂测试
    JAVAweb 分级测试
    第八周 课堂报告
    javaweb界面
    12月9日,第一次自查报告
    课程管理系统后台JAVA代码
    《程序员修炼之道+从小工到专家》读后有感
    12月9日 自查后续
    课程管理系统JAVAweb前端代码
  • 原文地址:https://www.cnblogs.com/shiqiboy3974/p/14829478.html
Copyright © 2011-2022 走看看