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

news2024/11/26 6:18:46

 

     如果对 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(...)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/715951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【调试】vscode远程连接服务器

概述 windows远程连接linux服务器进行操作&#xff0c;有多种方式。可以借助ssh客户端&#xff0c;MobaXterm&#xff0c;finalshell等&#xff0c;这两个我觉得是不错的软件。当然如果需要在服务器编写代码&#xff0c;我还是建议使用vscode这个神奇的工具。怎么用vscode远程…

Spring Boot 中的 TCC 事务

Spring Boot 中的 TCC 事务 在分布式系统中&#xff0c;事务一直是一个棘手的问题。传统的 ACID 事务无法满足分布式系统的需求&#xff0c;因为它们需要强一致性、单点故障和网络延迟等问题。近年来&#xff0c;随着微服务架构的普及&#xff0c;TCC 事务成为了一种非常流行的…

SpringMVC入门篇4 --- SSM整合案例

目录 SSM整合小案例 源码 1.整合配置(config目录) Spring - SpringConfigMyBatis - MyBatisConfig、JdbcConfig、jdbc.propertiesSpringMVC - ServletConfig、SpringMvcConfig 2.功能模块 模型(domain目录)&#xff1a;Book.java数据层(dao目录)&#xff1a;.BookDao.ja…

windows11安装Linux子系统

个人博客地址: https://cxx001.gitee.io Windows在10之后自带了虚拟机子系统功能&#xff0c;可以和本地磁盘共享&#xff0c;默认挂载到/mnt/目录下面。比起传统的VM方便多了。下面是搭建流程&#xff1a; 一 开启子系统服务 控制面板 -> 程序 -> 程序与功能 -> 启动…

学会vue3,仅需这一篇

V3-组合式API setup/reactive/ref/computed/watch/生命周期/父子通信/模板引用/provide和inject数据传输 vue3的优势** 组合式 API (Composition API) 是一系列 API 的集合&#xff0c;使我们可以使用函数而不是声明选项的方式书写 Vue 组件。 使用create-vue搭建Vue3项目…

Apikit 自学日记:API 变更历史

系统会自动保存API的每一次编辑内容。进入API详情页面&#xff0c;点击 编辑历史 &#xff0c;在弹窗中会列出API的每次改动&#xff0c;您可以点击 详情 了解编辑的概况信息。 如果您想对比当前版本和历史的某个版本的差别&#xff0c;点击 对比 按钮&#xff0c;会在新窗口中…

springboot整合shiro实现认证和授权(非常详细)

Shiro和Spring Sercurity应该是我们比较常用的权限框架了&#xff0c;这篇文章教大家怎么通过springboot整合shiro从0开始搭建一个包含权限控制的后台管理系统。 第一步&#xff1a;创建一个springboot项目 创建springboot项目&#xff0c;这里项目就命名为shiro 第二步&#…

如何用一键抠图工具在线压缩PNG图片

我们会发现&#xff0c;现在用的很多图片格式都是PNG&#xff0c;它通常以无损压缩的方式存储图像。然而&#xff0c;有时候我们可能会遇到PNG文件过大的问题&#xff0c;这样会导致文件传输、存储和加载速度变慢。怎么才能解决这个问题&#xff0c;有什么好用的工具推荐么&…

Linux--多个源文件编译:gcc -o 目标文件 源文件1 源文件2 ...

分析编译过程&#xff1a; 我们编译&#xff0c;实际上是针对.c文件。这里是main.c和test.c。 编译器在预处理的时候会将.h拷贝进.c文件。这里是test.h拷贝到test.c中 .c文件编译后变成.o目标文件。这里main.c和test.c文件编译后变成main.o和test.o 生成的.o文件再和lib.so…

CAD版本转换器有哪些?这些工具轻松转换CAD版本

当我们共享CAD文件时&#xff0c;如果接收人使用的CAD软件版本与发送人不同&#xff0c;则需要将CAD文件转换为接收人能够打开的版本。例如&#xff0c;当您使用的CAD软件版本为AutoCAD 2019&#xff0c;而接收人使用的CAD软件版本为AutoCAD 2017时&#xff0c;您需要将CAD文件…

【PCBA方案设计】电子体温计技术解决方案

体温计&#xff0c;是一种常用于医疗的小型测量产品&#xff0c;体温计通常分为汞体温计和电子体温计&#xff0c;汞体温计的原理非常简单&#xff0c;当汞加热时&#xff0c;它会膨胀&#xff0c;沿着非常狭窄的玻璃管上升。因此&#xff0c;我们将玻璃按一定比例划分&#xf…

windows 如何ping ip 加端口号

先在系统中找到 勾选上 和平时的pingip命令不一样了 现在是telnet ip 端口号 先看一组无法ping通端口号的案例 若telnet 127.0.0.1 6379 跳转至一个空白界面 代表ping此ip的端口号成功

搭建高性能数据库集群之二:MySQL读写分离(基于mycat)

一、MyCat概述 Mycat是数据库中间件。 使用场景&#xff1a; 高可用性与Mysql读写分离 业务数据分级存储大表水平拆分&#xff0c;集群并行计算数据库连接池整合多个数据源整合 安装 下载地址&#xff1a;http://dl.mycat.org.cn 安装Mycat之前&#xff0c;需要安装Mysq…

拜托!电梯机房还不会用这个技巧,就真的晚啦!

电梯是现代社会中不可或缺的交通工具之一&#xff0c;为了确保乘客的安全和顺畅运行&#xff0c;电梯机房的监控是至关重要的环节之一。 电梯机房烟感监控是现代建筑安全管理中非常重要的一环。随着城市高楼大厦的不断增多&#xff0c;电梯作为垂直交通的主要方式&#xff0c;其…

一篇文章告诉你VR全景展示的优势

引言 随着科技的不断进步&#xff0c;VR全景展示作为一项创新的技术应用&#xff0c;正以其独特的优势引领着营销行业的发展潮流。通过虚拟现实技术&#xff0c;VR全景展示为消费者带来了身临其境的观展体验&#xff0c;打破了传统展览的时空限制。 一&#xff0e;沉浸式体验 …

CH32V3xx CAN接口基本使用

1、CH32V3xx CAN简介 CH32V307具有2路CAN控制器,CAN控制器提供了完整的CAN协议实现方案,兼容CAN 规范2.0 A和2.0 B。可编程的传输速率,最高可达1Mbit/s。支持时间触发功能,可避免低优先级消息阻塞。支持3个发送邮箱,发送报文优先级可由报文标识或发送请求次序决定。支持3级…

【kubernetes系列】Kubernetes之生命周期和策略

概述 Pod 遵循一个预定义的生命周期&#xff0c;起始于 Pending 阶段&#xff0c;如果至少 其中有一个主要容器正常启动&#xff0c;则进入 Running&#xff0c;之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。 在 Pod 运行期间&#xff0c;k…

搭建Docker私有仓库

-v 主机到容器的映射&#xff08;卷的挂载&#xff1a;主机和容器的共享&#xff09; 创建容器一定要看成没成功 curl命令 访问浏览器命令 仓库装软件&#xff0c;配置------------- localhost 本机 127.0.0.1 改配置&#xff0c;重启容器 背景介绍 Docker regist…

数据仓库性能测试方法论与工具集

目录 文章目录 目录数据仓库 v.s. 传统数据库数据仓库性能测试案例性能指标测试方案测试场景测试数据集测试用例性能指标测试脚本工具 基准环境准备硬件环境软件环境 测试操作步骤Cloudwave 执行步骤导入数据集TestCase 1. 执行 13 条标准 SQL 测试语句TestCase 2. 执行多表联合…

Java Web JavaScript (3)23.7.3

7&#xff0c;事件监听 要想知道什么是事件监听&#xff0c;首先先聊聊什么是事件&#xff1f; HTML 事件是发生在 HTML 元素上的“事情”。比如&#xff1a;页面上的 按钮被点击、鼠标移动到元素之上、按下键盘按键 等都是事件。 事件监听是JavaScript 可以在事件被侦测到时…