POI操作生成xlsx和xls两种格式单元格下拉框


前言

使用POI生成某一列带有下拉框的Excel表格,下面例子我是用来生成导入模板的下载的


一、引入依赖

代码如下(示例):

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>${poi.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>${poi.version}</version>
    </dependency>

二、代码

1XSSFWorkbook生成下拉框

代码如下(示例):

 @Test
    public  void  testXlsxDropDown()throws Exception{
        File file= new File("D:\\c\\模板下拉.xlsx");
        OutputStream fileOutputStream = new FileOutputStream(file);
        Field[] declaredFields = EcsUserImportExcel.class.getDeclaredFields();
        List<EcsOrg> ecsOrgs = ecsOrgService.getBaseMapper().selectList(new LambdaQueryWrapper<EcsOrg>().eq(EcsOrg::getDelFlag, DEL_FLAG_NORMAL));
        //获取下拉框需要的数据数组
        List<String> orgNames = ecsOrgs.stream().map(e -> e.getOrgName()).collect(Collectors.toList());
        String[] datas=new String[orgNames.size()];
        orgNames.toArray(datas);
  
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
        SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook,100,false,false);
        SXSSFSheet sheet = workbook.createSheet("export");
        //首行 ,标题行
        SXSSFRow row = sheet.createRow(0);
        List<String> titleString=new ArrayList<>();
        //反射获取标题数据。
        for (Field declaredField : declaredFields) {
            ExcelHeader annotation = declaredField.getAnnotation(ExcelHeader.class);
            if (null!=annotation){
                titleString.add(annotation.value());
            }
        }
        //设置标题
        for (int i = 0; i < titleString.size(); i++) {
            SXSSFCell cell = row.createCell(i);
            cell.setCellValue(titleString.get(i));
        }
        //调用创建下拉框方法
        setLongHSSFValidation(workbook,datas,sheet,1,rowNum==null?10000:rowNum+1,16);
        workbook.write(fileOutputStream);
    }

2.创建下拉框方法

代码如下(示例):

 /**
     * excel设置下拉cell。下拉数据放在隐藏的sheet中。
     *  解决下拉框过长不显示问题
     * @param workbook   HSSFWorkbook 和XSSFWorkbook 都支持
     * @param dataList 下拉数据的数组
     * @param sheet
     * @param firstRow 开始行
     * @param endRow 结束行
     * @param cellNum 下拉框所在的列
     */
//    public static void setLongHSSFValidation(SXSSFWorkbook workbook,String[] deptList ,SXSSFSheet sheet ,int firstRow, int endRow, int cellNum,int sheetIndex) {
    public static void setLongHSSFValidation(Workbook workbook, String[] dataList , Sheet sheet , int firstRow, int endRow, int cellNum) {
        String hiddenName = "hidden" + cellNum;
        //1.创建隐藏的sheet页。        
        Sheet hidden = workbook.createSheet(hiddenName);
        //2.将下拉框需要的数组值存入隐藏的sheet中
        for (int i = 0, length = dataList.length; i < length; i++) {
            hidden.createRow(i).createCell(cellNum).setCellValue(dataList[i]);
        }
        //创建"名称"标签,用于链接
        Name category1Name = workbook.createName();
        category1Name.setNameName(hiddenName);
        //3 A1:A代表隐藏域创建第N列createCell(N)时。以A1列开始A行数据获取下拉数组
        category1Name.setRefersToFormula(hiddenName + "!A$1:A$" + dataList.length);
        //数据有效性对象
        DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidationConstraint constraint = helper.createFormulaListConstraint(hiddenName);
        //四个参数:要添加下拉框的首行、末行、首列、末列
        CellRangeAddressList addressList = new CellRangeAddressList(1, endRow, cellNum, cellNum);
        DataValidation dataValidation = helper.createValidation(constraint, addressList);
        if (dataValidation instanceof XSSFDataValidation) {
            // 数据校验
            dataValidation.setSuppressDropDownArrow(true);
            dataValidation.setShowErrorBox(true);
        } else {
            dataValidation.setSuppressDropDownArrow(false);
        }
        // 作用在目标sheet上
        sheet.addValidationData(dataValidation);
        // 设置hiddenSheet隐藏
        workbook.setSheetHidden(workbook.getSheetIndex(hidden),true);
    }

总结

上方的列子是使用SXSSFWorkbook创建xlsx格式的Excel表格,生成下拉框的方法可以传入HSSFWorkbook和HSSFSheet对象创建xls格式的Excel表格。 上面只给出了主要的POI依赖,其他依赖请自行添加。

本文借鉴了:

1java操作poi生成excel.xlsx设置下拉框https://blog.csdn.net/weixin_39709686/article/details/82828007
以及:

2下拉框数据过多不显示问题https://blog.csdn.net/u012427355/article/details/111995378


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值