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

news/2024/7/21 5:04:25 标签: 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(...)


http://www.niftyadmin.cn/n/1680034.html

相关文章

SpringMVC ---- HelloWorld

SpringMVC ---- HelloWorld1. 开发环境2. 创建maven工程3. 配置web.xml4. 创建请求控制器5. 创建springMVC的配置文件6. 测试HelloWorld7. 总结1. 开发环境 IDE&#xff1a;idea2022.1 构建工具&#xff1a;maven3.5.4 服务器&#xff1a;tomcat7 Spring版本&#xff1a;5.3.1…

python 查找excel标红的数据_如何在excel中实现:成批量查找字符串中指定位置的字符,并标为红色 - 程序语言 - 小木虫 - 学术 科研 互动社区...

楼上的很好我录制了个vba &#xff0c;修改了下&#xff0c;也可以。你把下面的vba 代码贴进去也可以&#xff0c;你也可以根据情况自己修改。Sub Macro1() Macro1 MacroFor i 1 To Range("a65536&quot.End(xlUp).Row 字符串放在 A 列&#xff0c;开始变红的位置数…

15.01.23-sql的注入式攻击

很多网站上有登录和忘记密码的链接&#xff0c;可能存在sql注入的隐患。在忘记密码(把密码发送到邮箱)那里测试。 获取数据 1.的妙用。在邮箱栏输入emailaddress&#xff0c;如果返回服务器错误&#xff0c;则说明sql注入成功&#xff0c;sql语句执行那里发现了多余的&#xff…

如何向水晶报表数据源中的存储过程传参数……

水晶报表会自动为每个“存储过程中的参数”建立一个“参数字段”&#xff0c;所以这就成了运行时给参数赋值的问题了…… 参数字段运行时自定义 [Visual Basic] 声明将参数传递给查看器控件所需的变量。Dim paramFields As New ParameterFields()Dim paramField As New Parame…

Java版图形界面计算器

Java版图形界面计算器1. 实验介绍1. 实验内容2. 实验知识点3. 完整代码2. 实验原理3. 实验步骤1. 项目创建2. UI组件创建和初始化3. 在窗口中添加 UI 组件4. 响应事件需要使用的变量5. 数字键的响应6. 小数点的响应7. 运算符号的响应8. 等于的响应9. 计算逻辑的实现10. 清除的响…

js 编码解码 escape,encodeURI,encodeURIComponent

js对文字进行编码涉及3个函数&#xff1a;escape,encodeURI,encodeURIComponent&#xff0c;相应3个解码函数&#xff1a;unescape,decodeURI,decodeURIComponent1、 传递参数时需要使用encodeURIComponent&#xff0c;这样组合的url才不会被#等特殊字符截断。 例如&a…

oracle sql优化工具_分享一款Oracle数据库SQL调优工具--SQLBooster

概述我们在进行SQL调优时经常需要花费大量时间进行问题分析和定位&#xff0c;找到性能瓶颈后&#xff0c;再根据调优规则以及以往累计的知识和经验对语句进行优化&#xff0c;最终解决SQL性能问题。而SQL调优对于一个缺乏经验的开发者或DBA来说&#xff0c;面对一条存在性能问…

flex 换主轴后子元素占满_flex布局踩过的那些坑

接触H5项目后&#xff0c;开始了解到flex布局&#xff0c;功能非常之强大&#xff0c;用起来相当之舒服。基本的知识介绍就不说了&#xff0c;参考http://www.ruanyifeng.com/blo...。接下来说说我踩过的那些坑&#xff1a;1.flex布局版本兼容问题flex布局自2009提出之后&#…