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;
    }

}


相关推荐
leobertlan25 分钟前
2025年终总结
前端·后端·程序员
面向Google编程1 小时前
从零学习Kafka:数据存储
后端·kafka
易安说AI2 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI2 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI2 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
JH30732 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
颜酱3 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_3 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble4 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟4 小时前
使用ASM和agent监控属性变化
java