JAVA实现easyExcel动态生成excel

添加pom依赖

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

实体类

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

执行方法

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){//动态生成exceltry {//动态列值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 {//动态导出exceltry {//动态列值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->{//将对象转换为mapMap<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;}}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

StatusBar,状态栏设置中文

在Qt的ui中&#xff0c; 菜单栏–View–Property Editor–statusBarVisible–勾选– 在C代码中&#xff0c; sloem1.h private://任意写一个函数void onStatusBarShow();sloem1.cpp void sloem1::onStatusBarShow() {QString strLabel;//显示文字来源this->setTextResour…

OSPF的协议特性

路由汇总的概念 l 路由汇总&#xff08; Route Aggregation &#xff09;&#xff0c;又称路由聚合&#xff08;Route Summarization&#xff09;&#xff0c;指的是把一组明细路由汇聚成一条汇总路由条目的操作 l 路由汇总能够减少路由条目数量、减小路由表规模&#xff0…

Linux-进程和计划任务管理⭐

目录 一、程序和进程 1.程序 2.进程 3.线程与进程 二、ps查看静态进程信息 1.ps aux 命令 2.ps-静态查看系统进程 3.ps -elf 三、top-查看进程动态信息 四、pgrep查看进程信息 五、pstree-查看进程树 六、控制进程 1.进程启动方式 2.调度启动 3.进程的前后台调…

springboot使用Mybatis中兼容多数据源的databaseId(databaseIdProvider)的简单使用方法

最近有兼容多数据库的需求&#xff0c;原有数据库使用的mysql&#xff0c;现在需要同时兼容mysql和pgsql&#xff0c;后期可能会兼容更多。 mysql和pgsql很多语法和函数不同&#xff0c;所以有些sql需要写两份&#xff0c;于是在全网搜索如何在mapper中sql不通用的情况下兼容多…

LeetCode //C - 38. Count and Say Medium Topics Companies

38. Count and Say The count-and-say sequence is a sequence of digit strings defined by the recursive formula: countAndSay(1) “1”countAndSay(n) is the way you would “say” the digit string from countAndSay(n-1), which is then converted into a differen…

前端开发禁用F12和右键检查元素处理

只需要对应的页面引入西面这个js文件就行(创建一个.js文件,将下面代码粘贴进去页面引用后使用) window.onload function () {document.onkeydown function () {var e window.event || arguments[0];//屏蔽F12if (e.keyCode 123) {return false;//屏蔽CtrlShiftI} else if …

【ARMv9 DSU-120 系列 10 -- PMU 详细介绍】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DSU-120 PMUPMU features事件接口系统寄存器计数器PMU寄存器接口PMU eventsPMU interruptExternal cluster PMU registersDSU-120 PMU DynamIQ™共享单元-120(DSU-120)包括性能监视器,这些监视器使您能够在运行时收…

Laravel 6 - 第十七章 配置数据库

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

《动手学深度学习(Pytorch版)》Task01:初识深度学习——4.22打卡

《动手学深度学习&#xff08;Pytorch版&#xff09;》Task01&#xff1a;初识深度学习 深度学习介绍AI地图深度学习任务图片分类物体检测和分割样式迁移人脸合成文字生成图片文字生成无人驾驶 案例&#xff1a;广告点击完整过程 QAQ&#xff1a;机器学习的可解释性&#xff1a…

electron使用typescript

引入 TypeScript 到 Electron 项目中是一个增强代码质量和开发体验的好方法&#xff0c;因为 TypeScript 提供了静态类型检查、接口和类等强大的语言特性。下面是将 TypeScript 集成到 Electron 项目中的步骤&#xff1a; 1. 初始化项目 如果你还没有创建 Electron 项目&…

【C++ STL序列容器】list 双向链表

文章目录 【 1. 基本原理 】【 2. list 的创建 】2.1 创建1个空的 list2.2 创建一个包含 n 个元素的 list&#xff08;默认值&#xff09;2.3 创建一个包含 n 个元素的 list&#xff08;赋初值&#xff09;2.4 通过1个 list 初始化另一个 list2.5 拷贝其他类型容器的指定元素创…

速盾:ddos高防ip原理

DDoS&#xff08;分布式拒绝服务攻击&#xff09;是一种常见的网络攻击方式&#xff0c;通过向目标服务器发送大量的请求&#xff0c;使其无法正常处理合法用户的请求&#xff0c;从而导致服务不可用。为了应对这种攻击&#xff0c;高防IP技术应运而生。 高防IP是一种专门为抵…

oracle--merge into :匹配则更新不匹配则插入

merge into &#xff1a;匹配则更新不匹配则插入 --语法 merge into 目标表 using &#xff08;增量&#xff09; on (匹配字段&#xff09; where matched then update set --update和sel直接不需要加表名 when not matched then insert values--insert和values之间不需要加i…

swagger文档接口根据包分组配置

文章目录 一、引言二、配置2.1 原本配置及效果2.2 更改后配置及效果 三、结束 一、引言 关于接口文档的详细配置可参见文章API文档生成工具-----Knife4j的详细介绍、配置及应用 此文章是基于已经完成基础配置的前提下,如何根据不同包进行分组 二、配置 2.1 原本配置及效果 …

Hadoop实战——MapReduce-字符统计(超详细教学,算法分析)

目录 一、前提准备工作 启动hadoop集群 二、实验过程 1.虚拟机安装先设置端口转发 2.上传对应文件 3.编写Java应用程序 4. 编译打包程序 5. 运行程序 三、算法设计和分析 算法设计 算法分析 四、实验总结 实验目的&#xff1a;给定一份英文文本&#xff0c;统计每个…

matlab新手快速上手5(蚁群算法)

本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程&#xff0c;对matlab新手友好&#xff0c;源码在文末给出。 蚁群算法简介&#xff1a; 蚁群算法是一种启发式优化算法&#xff0c;灵感来源于观察蚂蚁寻找食物的行为。在这个算法中&#xff0c;解决方案被看作是…

数学分析复习:中值定理、反函数定理

文章目录 中值定理、反函数定理 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 中值定理、反函数定理 定理&#xff1a;Rolle&#xff08;罗尔&#xff09;中值定理 设实值函数 f ∈ C 0 [ a , b ] f\in C^0[a,b] f∈C0[a,b] 且在 ( a , b ) (a,b) (a,b) 上可微&…

平衡二叉树、红黑树、B树、B+树

Tree 1、前言2、平衡二叉树和红黑树3、B树和B树3.1、B树的构建3.2、B树和B树的区别3.3、数据的存储方式 1、前言 本文侧重在理论方面对平衡二叉树、红黑树、B树和B树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C中的实现&#xff0c;我的上一篇文章平衡…

Golang实现一个批量自动化执行树莓派指令的软件(4)上传

简介 话接上篇 Golang实现一个批量自动化执行树莓派指令的软件(3)下载 &#xff0c; 继续实现上传 环境描述 运行环境: Windows&#xff0c; 基于Golang&#xff0c; 暂时没有使用什么不可跨平台接口&#xff0c; 理论上支持Linux/MacOS 目标终端&#xff1a;树莓派DebianOS(主…

【JS】前端文件读取FileReader操作总结

前言&#xff1a;开发中经常遇到文件上传的场景&#xff0c;有时需要前端将文件内容读取出来再以base64格式传到接口。 目录 FileReader主要方法readAsArrayBuffer(blob)readAsText(blob, [encoding])readAsDataURL(blob) 主要事件React antd Upload 组件示例 FileReader Fil…