JAVA实现easyExcel动态生成excel

添加pom依赖

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.6</version>
</dependency>

 <!--工具类-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.1</version>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.21</version>
</dependency>

实体类

java 复制代码
package com.example.mybatismysql8demo.vo;


import lombok.*;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@Data
@Accessors(chain = true)
public class EasyExcelExportVo {

    private String name;

    private Integer age;

    private Integer height;

    private BigDecimal weight;

    private Date birthday;

}

执行方法

java 复制代码
package com.example.mybatismysql8demo.controller;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSONObject;
import com.example.mybatismysql8demo.vo.EasyExcelExportVo;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;


@Slf4j
@RestController
public class EasyExcelController {

    @RequestMapping(value = "easyExcelExport", method = RequestMethod.GET)
    public void easyExcelExport(HttpServletResponse response) {
        dynamic(response,2);
    }

    public void dynamic(HttpServletResponse response,Integer state){
        if (state == 1){
            //动态生成excel
            try {
                //动态列值
                List<String> headName = Arrays.asList("姓名","性别","身高","年龄");
                List<List<String>> result = new ArrayList<>();
                headName.forEach(data-> result.add(Collections.singletonList(data)));
                //告诉浏览器数据格式,将头和数据传到前台
                response.setContentType("application/vnd.ms-excel");
                response.setCharacterEncoding("utf-8");
                response.setHeader("Content-disposition", "attachment;filename=" +  URLEncoder.encode("用户信息表.xls", StandardCharsets.UTF_8));
                EasyExcel.write(response.getOutputStream())
                        .autoCloseStream(Boolean.FALSE)
                        .head(result)
                        .sheet("信息表")
                        .doWrite(Collections.EMPTY_LIST);
                //关闭流
                response.getOutputStream().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            //动态导出excel
            try {
                //动态列值
                Map<Integer,Object> map = getField();
                List<String> headName = (List<String>) map.get(1);
                List<List<String>> result = new ArrayList<>();
                headName.forEach(data->{
                    //添加标题
                    result.add(Lists.newArrayList("用户信息",data));
                });
                //数据
                List<List<Object>> data = (List<List<Object>>) map.get(2);
                //告诉浏览器数据格式,将头和数据传到前台
                response.setContentType("application/vnd.ms-excel");
                response.setCharacterEncoding("utf-8");
                response.setHeader("Content-disposition", "attachment;filename=" +  URLEncoder.encode("用户信息表.xls", StandardCharsets.UTF_8));
                EasyExcel.write(response.getOutputStream())
                        .autoCloseStream(Boolean.FALSE)
                        .head(result)
                        .sheet("信息表")
                        .doWrite(data);
                //关闭流
                response.getOutputStream().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static Map<Integer,Object> getField(){
        //前端配置动态字段,存储数据库
        String fields = "[{\"field\":\"age\",\"text\":\"年龄\"},{\"field\":\"height\",\"text\":\"身高\"},{\"field\":\"name\",\"text\":\"姓名\"},{\"field\":\"weight\",\"text\":\"体重\"}]";
        List<Map> mapList = JSONObject.parseArray(fields,Map.class);
        //字段名称
        List<String> fieldList = mapList.stream().map(v -> v.get("text").toString()).collect(Collectors.toList());
        //字段属性名称
        List<String> fieldNames = mapList.stream().map(v -> v.get("field").toString()).collect(Collectors.toList());
        //获取数据
        List<EasyExcelExportVo> data = getDateList();
        //数据处理
        List<List<Object>> list = new ArrayList<>();
        data.forEach(value->{
            //将对象转换为map
            Map<String, Object> mapInfo = BeanUtil.beanToMap(value);
            //遍历动态字段值
            List<Object> objectList = new ArrayList<>();
            fieldNames.forEach(key->{
                objectList.add(mapInfo.get(key));
            });
            list.add(objectList);
        });
        Map<Integer,Object> map = new HashMap<>(2);
        map.put(1,fieldList);
        map.put(2,list);
        return map;
    }

    public static void main(String[] args) {
        System.out.println(getField());
    }

    public static List<EasyExcelExportVo> getDateList(){
        List<EasyExcelExportVo> info = new ArrayList<>();
        Collections.addAll(info,
                new EasyExcelExportVo().setName("张三").setAge(18).setHeight(160).setWeight(new BigDecimal(100)).setBirthday(new Date()),
                new EasyExcelExportVo().setName("李四").setAge(18).setHeight(160).setWeight(new BigDecimal(100)).setBirthday(new Date()),
                new EasyExcelExportVo().setName("王五").setAge(18).setHeight(160).setWeight(new BigDecimal(100)).setBirthday(new Date()),
                new EasyExcelExportVo().setName("小明").setAge(20).setHeight(180).setWeight(new BigDecimal(120)).setBirthday(new Date())
        );
        return info;
    }

}


相关推荐
悟能不能悟几秒前
java 判断string[]中是否有a
java·开发语言
4***1490几秒前
高并发时代的“确定性”挑战——为何稳定性正在成为 JVM 的下一场核心竞争?
java·开发语言·jvm
hahjee5 分钟前
Go编写的ANSI终端颜色和样式控制库在OpenHarmony PC上的完整适配实战
开发语言·后端·鸿蒙
野蛮人6号12 分钟前
黑马微服务p10mybatisplus09核心功能iservice 测试文档无法正常打开
java·黑马微服务
危险、14 分钟前
《Java Stream 中 toMap 的生产级用法:一次 Duplicate key 的异常问题复盘》
java
古城小栈19 分钟前
Java 内存优化:JDK 22 ZGC 垃圾收集器调优
java·python·算法
福大大架构师每日一题22 分钟前
rust 1.92.0 更新详解:语言特性增强、编译器优化与全新稳定API
java·javascript·rust
小火锅啊25 分钟前
java实现生成PDF文件
后端
xiaogc_a25 分钟前
【无标题】
java
源码技术栈31 分钟前
智慧工地微服务架构+Java+Spring Cloud +Uni-App +MySql开发,在微信公众号、小程序、H5、移动端
java·ai·saas·智慧工地·智慧工地项目·可视化大屏·智慧工地系统