Apache组件POI,勾选导出Excel文件。

 

     如果对 POI组件、Maven依赖不了解的小伙伴,在观看本篇文章之前可以先观看我上一篇文章: Apache组件POI,将图片下载到Excel文件中并导出。 。 本篇文章主要讲解Excel文件如何实现勾选导出。

     我们先看一下勾选导出时的入参参数,其中 "exportField" 字段是 List<String> 类型,里面存放着需要导出的字段及其顺序,exportField字段中的值及字段顺序,是前端同事给与。

{
    "age":"",
    "createDate":"",
    "distinct":true,
    "exportField":[
        "name",
        "age",
        "id",
        "isDeleted",
        "remark",
        "headPhoto"
    ],
    "id":"",
    "isDeleted":"",
    "name":""
}



Service层核心代码简单讲解:

    /**
     * 用户信息 勾选导出
     *
     * @param paramDTO  用户入参DTO
     * @param response  response请求
     *
     * @throws Exception
     *
     * @author moon  2023/6/27 10:31
     */
    @Override
    public void exportUser2(UserParamDTO paramDTO, HttpServletResponse response) throws Exception {

        Assert.isTrue(!CollectionUtils.isEmpty(paramDTO.getExportField()), ExceptionEnum.Exception_20000.getDesc());

        // 1-1、获取列表查询数据
        List<UserVO> userVOList = userMapperExt.selectUserByParamDTO(paramDTO);

        // 1-2、将 UserVO 转成 UserExportVO
        List<UserExportVO> exportVOS = userVOList.stream().map(infoVO -> BeanUtils.convert(infoVO, UserExportVO.class)).collect(Collectors.toList());

        //空数据导出不了标题 需要放一个空对象
        if (CollectionUtils.isEmpty(exportVOS)) {
            exportVOS = new ArrayList<>();
        }

        // Map<'英文名', '中文名'> 组合形式.
        Map<String, String> aliasMap = ExcelUtils.getDTOAliasTitle(UserExportVO.class, Constant.BooleanFlag.FALSE);
        // 勾选导出关键点:根据入参 "exportField" 中的字段顺序,确定头行标题.
        List<String> headerList = new ArrayList<>(paramDTO.getExportField());

        // 2-1、创建 工作簿 对象.
        Workbook workbook = new XSSFWorkbook();
        // 2-2、创建工作表对象
        Sheet sheet = workbook.createSheet();
        // 设置标题行,第0行.
        Row headerRow = sheet.createRow(Constant.Digital.ZERO);

        // 获取头部单元格样式
        CellStyle headerCellStyle = ExcelUtils.getCellStyle(workbook, HorizontalAlignment.CENTER, VerticalAlignment.CENTER, Constant.Digital.TWO);
        // 2-3、设置头部单元格样式
        for (int i = 0; i < headerList.size(); i++) {
            // 获取中文值
            String value = aliasMap.get(headerList.get(i));
            Cell cell = headerRow.createCell(i);
            // 设置 样式
            cell.setCellStyle(headerCellStyle);
            // 设置 值
            cell.setCellValue(value);
        }


        // 2-4、填充单元格数据,为方便观看代码,我将图片处理部分删除。
        for (int i = 0; i < exportVOS.size(); i++) {

            // 创建行对象,从第1行开始。
            int rowNum = i + 1;
            Row row = sheet.createRow(rowNum);
            UserExportVO tempVO = exportVOS.get(i);

            // 创建单元格对象(列)并设置值
            for (int j = 0; j < headerList.size(); j++) {
                Cell cell = row.createCell(j);
                Field field = UserExportVO.class.getDeclaredField(headerList.get(j));
                // 若属性为私有,需要设置可访问。
                field.setAccessible(Constant.BooleanFlag.TRUE);
                String fieldValue;
                // 判断 field.get(tempVO) 是否为 null
                if (Objects.isNull(field.get(tempVO))) {
                    fieldValue = Constant.CommonlySymbols.EMPTY;
                } else {
                    fieldValue = field.get(tempVO).toString();
                }

                cell.setCellValue(fieldValue);
            }
        }

        // 将工作簿写入文件中
        try {

            response = ExcelUtils.getHttpServletResponse(response, Constant.ExcelProperty.USER_EXPORT_NAME);
            ServletOutputStream outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } finally {
            workbook.close();
        }

    }


    在上述代码块中,通过  List<String> headerList 来接收前端传递的勾选导出字段,并以此来控制Excel文件的标题、标题顺序、单元格数据。

    启动服务后,运行结果如下图二所示:

 

 图一

 图二

Gitee上的Demo案例:  apache-poi-demo   ,项目名称:apache-poi-demo .             

入口函数:com.moon.poi.service.impl.UserServiceImpl#exportUser2(...)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache poi 导出excel时合并单元格可以使用setRegionStyle方法来设置合并单元格的样式。这个方法接受三个参数,分别是Sheet对象、CellRangeAddress对象和CellStyle对象。在这个方法中,通过循环遍历合并单元格的每一行和每一列,然后获取对应的单元格并设置样式。具体的代码实现可以参考引用\[1\]中的示例代码。 此外,还可以使用PoiModel类来定义导出excel时的数据模型。这个类包含了内容、上一行同一位置内容、行标、列标等属性。可以根据实际需求来使用这个类。具体的代码实现可以参考引用\[2\]和引用\[3\]中的示例代码。 总结起来,Apache poi 导出excel时合并单元格的步骤包括设置合并单元格的样式和定义导出数据的模型。可以根据具体的需求来使用相应的方法和类来实现导出功能。 #### 引用[.reference_title] - *1* *3* [poi 导出Excel 动态 合并单元格](https://blog.csdn.net/weixin_65436454/article/details/127806178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用POI 导出Excel 动态合并单元格](https://blog.csdn.net/weixin_41722928/article/details/112849624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值