POI动态导出Excel(动态导出前台选中的字段)

业务场景:用户勾选想要导出的字段
本来想着百度搜下大神封装好的util,直接拿过来用,然而发现网上大都是写死的(网上好多都是全表字段导出)
于是就自己写了个通用的动态导出封装类,前台选中什么字段就导出什么字段

先看效果:

这是我数据库表的字段
在这里插入图片描述
假如用户现在只想导出name和phone这两个字段:
直接上导出成功效果图:
在这里插入图片描述

第一步:导入POM

 <!--excel导入导出 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.11-beta2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.11-beta2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.11-beta2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-excelant</artifactId>
            <version>3.11-beta2</version>
        </dependency>

第二部:导入我的util类(注释写的很明白啦)

 /**
     * @param title  表格的名字
     * @param heards 前台选中要导出的字段
     * @param list   查询数据库返回所有字段的结果
     * @param out    输出流
     * @throws Exception
     */
    public static void exportUtil(String title, String[] heards, List<?> list, OutputStream out) throws Exception {
        // 创建excel工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 创建excel表
        HSSFSheet sheet = workbook.createSheet(title);
        // 创建标题行
        HSSFRow titleRow = sheet.createRow(0);
        // 标题行写内容
        for (int i = 0; i < heards.length; i++) {
            String s = heards[i];
            HSSFCell cell = titleRow.createCell(i);
            cell.setCellValue(s);
        }

        // 数据行,从1行开始,共list.size行
        for (int i = 1; i <= list.size(); i++) {
            // 创建行
            HSSFRow listRow = sheet.createRow(i);
            // 数据行单元格,从0开始,共heards.length列
            for (int j = 0; j < heards.length; j++) {
                // 创建数据单元格
                HSSFCell listCell = listRow.createCell(j);
                // 通过反射的方式,将heards元素通过字符串拼接的方式,拼接出实体类相对应的get方法;
                String methodName = "get" + heards[j].substring(0, 1).toUpperCase() + heards[j].substring(1);

                try {
                    // 通过反射拿到类对象,再获取类对象的额methodName这个方法
                    Method declaredMethod = Student.class.getDeclaredMethod(methodName, null);
                    // 通过invoke提交对象,执行declaredMethod这个方法
                    // 从List<Student>集合中取出list.get(i - 1)的methodName属性的值;
                    Object result = declaredMethod.invoke(list.get(i - 1));

                    //判断返回值的类型
                    if (result instanceof Date) {
                        //填写日期格式内容
                        HSSFDataFormat dataFormat = workbook.createDataFormat();
                        short format = dataFormat.getFormat("yyyy年MM月dd日");
                        HSSFCellStyle cellStyle = workbook.createCellStyle();
                        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                        cellStyle.setDataFormat(format);
                        listCell.setCellStyle(cellStyle);
                    } else {
                        //设置内容
                        listCell.setCellValue(result.toString());
                    }
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }

            }
        }

         /*// 设置响应头
        response.setContentType("application/vnd.ms-excel");
        String fileName = "用户自定义信息表.xls";
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.addHeader("Content-Disposition", "attachment;" + fileName);
        workbook.write(response.getOutputStream());*/
        try {
            workbook.write(out);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

第三部:直接调用测试

 @RequestMapping("/exports")
    public Map exports(HttpServletResponse response) throws Exception {
        Map map = new HashMap();
        String[] heards = {"id", "name"};
        List<Student> list = exportService.export();
        exportUtil("zsp", heards, list, new FileOutputStream("E:/test.xls"));
        return map;
    }
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值