黑豹程序员-EasyExcel实现导出

news2024/11/19 14:42:19

需求

将业务数据导出到excel中,老牌的可以选择POI,也有个新的选择EasyExcel。

有个小坑,客户要求样式比较美观,数字列要求千位符,保留2位小数。
可以用代码实现但非常繁琐,用模板就特别方便,模板定义好格式,填充数据即可。

于是开干!

模板

在项目的src\main\resources\templates,静态模板资源目录下,如果templates不存在,创建即可
settle.xlsx

注意下面的模板格式,填充列表,下面{.name}代表entity对应的字段
在这里插入图片描述

修改Entity实体,加控制注解

注意两个注解:
@ExcelIgnore 标识这个字段不会处理
@ExcelProperty(“结算金额”) 要处理的字段,已经如果写入时,列头的名称

package com.rlcloud.system.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @version v1.0 创建时间:2023/11/27 16:36
 * @author: 作者:陈子枢
 * @web CSDN:https://blog.csdn.net/nutony
 * @description 描述:
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_settle")           //映射数据库表
public class Settle {
    //序列化时,不采用long类型,而采用string类型,防止雪花精度丢失问题
    @JsonSerialize(using= ToStringSerializer.class)
    @TableId(type = IdType.ASSIGN_ID)   //主键生成策略,雪花
    @ExcelIgnore
    private Long id;

    @NotNull(message = "结算批次不能为空")
    @ExcelProperty("结算批次")
    private String batch;

    @NotNull(message = "结算日期不能为空")
    @ExcelProperty("结算日期")
    private String dtTimeArr;

    @NotNull(message = "业务量不能为空")
    @ExcelProperty("业务量")
    private BigDecimal volumeAmt;

    @NotNull(message = "结算金额不能为空")
    @ExcelProperty("结算金额")
    private BigDecimal settleAmt;

    @ExcelIgnore
    private String createBy;
    @ExcelIgnore
    private Date createTime;
}

Controller代码

    @GetMapping("/ljt/settle/export")
    public void export(HttpServletResponse response) throws IOException {
        QueryWrapper qw = new QueryWrapper();
        qw.orderByDesc("create_time");
        //查询数据
        List<Settle> dataList = settleService.list(qw);

        //此处getResourceAsStream 用于获取服务器打包后的Excel模板文件流;
        //如果采用getPath方法获取文件地址本地ieda环境可以获取到,上传到服务器后会失效。采用流可以都生效,具体原因暂未仔细查看。有兴趣的童鞋可以自己去尝试!
        InputStream resourceAsStream = ResourceUtil.getStream("classpath:templates/settle.xlsx");
        //读取Excel 根据指定模板导出
        ExcelWriter excelWriter = EasyExcel.write(getOutputStream("结算数据.xlsx",response)).withTemplate(resourceAsStream).excelType(ExcelTypeEnum.XLSX).build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();     //关键,多组数据填充需要另起一行,默认为false

        //直接写入Excel数据(list是我查询并需导出的数据,并且里面的字段和excel需要导出的字段对应)
        excelWriter.fill(dataList, fillConfig, writeSheet);     //注意模板中需要写变量{.name}
        excelWriter.finish();
    }

    public static OutputStream getOutputStream(String fileName, HttpServletResponse response)  {
        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            return response.getOutputStream();
        } catch (IOException e) {
            log.error("导出excel表格失败", e);
        }
        return null;
    }

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

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

相关文章

通过仿真理解完整的阵列信号噪声模型

概要 噪声对无线电设备的信号接收会造成影响,是通信、雷达、导航、遥感等工程应用领域中的关键考虑因素。通常认为阵列合成能够提升信噪比,但忽略了这一论断的前提,即不同通道引入的噪声互不相关。但实际应用中,接收的噪声不仅仅包含信道引入的不相关噪声,还包含从外界环…

智能优化算法应用:基于鲸鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鲸鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鲸鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鲸鱼算法4.实验参数设定5.算法结果6.参考文献7.MA…

React基础语法整理

安装&#xff1a; yarn create react-app reatc-lesson --template typescript yarn create 创建一个react-app的应用 项目名称 typescript 的模板react-app 官方地址 https://create-react-app.bootcss.com/docs/adding-typescriptreact 语法文档 https://zh-hans.react.dev…

【C++】输入输出流 ⑤ ( cin 输入流对象 | cin.ignore() 函数 | cin.peek() 函数 | cin.putback() 函数 )

文章目录 一、cin.ignore() 函数1、cin.ignore() 函数简介2、cin.ignore() 函数原型3、代码示例 - cin.ignore() 函数 二、cin.peek() 函数1、cin.peek() 函数简介2、代码示例 - cin.peek() 三、cin.putback() 函数1、cin.putback() 函数简介2、代码示例 - cin.putback() 一、c…

MEME成风,为何比特币生态无法复刻以太坊生态的多样玩法?

铭文市场火了之后&#xff0c;很多人对 BTC L2 投入了过多的期许&#xff0c;认为 BTC 2 层会像以太坊 layer2 一样辉煌&#xff1f; 然而事实是&#xff0c;比特币生态的「成功」可能很长时间会停滞在「资产发行」叙事阶段&#xff0c;要复刻以太坊的生态多样玩法&#xff0c…

thinkphp6入门(12)-- 一对一关联模型

定义一对一关联&#xff0c;例如&#xff0c;一个用户都有一个个人资料。 一、两表 1.用户表:user 2.工作经验表&#xff1a;work_experience user表的id关联work_experience表的user_id。 注意看&#xff0c;user_id1的有2条工作经验 二、数据模型 主表模型&#xff1a;…

低多边形3D建模动画风格纹理贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

掌握PyTorch数据预处理(一):让模型表现更上一层楼!!!

引言 在PyTorch中&#xff0c;数据预处理是模型训练过程中不可或缺的一环。通过精心优化数据&#xff0c;我们能够确保模型在训练时能够更高效地学习&#xff0c;从而在实际应用中达到更好的性能。今天&#xff0c;我们将深入探讨一些常用的PyTorch数据预处理技巧&#xff0c;…

【交换排序 简单选择排序 堆排序 归并排序】

文章目录 交换排序简单选择排序堆排序归并排序 交换排序 冒泡排序的算法分析&#xff1a; 冒泡排序最好的时间复杂度是O&#xff08;n&#xff09;冒泡排序最好的时间复杂度是O&#xff08;n平方&#xff09;冒泡排序平均时间复杂度为O&#xff08;n的平方&#xff09;冒泡排…

1-6、编程语言排行榜

语雀原文链接 https://www.tiobe.com/tiobe-index/

基于Vue框架的电子商城购物平台小程序的设计与开发

基于JavaWebSSMVue电子商城购物平台小程序系统的设计和实现 源码获取入口KaiTi 报告/Ren务书Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 KaiTi 报告/Ren务书 一、选题的目的和意义 自从微信推出了微信小程序…

如何自动筛选高质量的指令微调数据喂给大模型?

前言 大家都知道在大模型时代&#xff0c;数据有多么重要&#xff0c;质量多高都不过分&#xff01;甚至直接决定着最终的效果。 尤其做SFT&#xff0c;模型框架基本不用改&#xff08;事实上也改不动&#xff09;&#xff0c;如何做一份符合自己场景高质量的SFT数据成了唯一…

C++中STL的容器vector

文章目录 什么是vectorvector与普通顺序表不同的点 vector的成员函数operatoroperator[]begin与end与iteratorsize()capacityresizeemptyreservepush_backpop_backinserteraseswapclear成员变量 总结 什么是vector vector&#xff1a;是数据结构里面的顺序表&#xff0c;开辟一…

【MATLAB】基于EMD分解的信号去噪算法(基础版)

代码操作 【MATLAB】基于EMD分解的信号去噪算法&#xff08;基础版&#xff09; 代码的主要内容 基于EMD&#xff08;经验模态分解&#xff09;的信号去噪算法通常可以结合相关系数、信号的熵值或者方差贡献率来完成去噪处理。这些指标可以用于确定阈值&#xff0c;从而对信号…

WPF仿网易云搭建笔记(2):组件化开发

文章目录 前言专栏和Gitee仓库依赖属性实战&#xff1a;缩小&#xff0c;全屏&#xff0c;关闭按钮依赖属性操作封装主窗口传递this本身给TitleView标题控件主要代码MainWindow.xmalMainWindow.cs依赖属性方法封装TitleView.csTitleViewModelTitleViewModel实现效果 前言 这次…

FreeRTOS的内存管理方法(超详细)

内存管理 我们知道每次创建任务、队列、互斥锁、软件定时器、信号量或事件组时&#xff0c;RTOS 内核都需要 RAM &#xff0c; RAM 可以从 RTOS API 对象创建函数内的 RTOS 堆自动动态分配&#xff0c; 或者由应用程序编写者提供。 如果 RTOS 对象是动态创建的&#xff0c;那么…

Mac虚拟机CrossOver23破解版下载和许可证下载

CrossOver Mac Mac 和 Windows 系统之间的兼容工具。使 Mac 操作系统的用户可以运行 Windows 系统的应用&#xff0c;从办公软件、实用工具、游戏到设计软件&#xff0c; 您都可以在 Mac 程序和 Windows 程序之间随意切换。 系统要求 运行macOS的基于Intel或Apple Silicon 的…

99、NeRF ray space

CG相机模型 在图形学中最常用的相机模型的原理和小孔成像是类似的。 不同之处在于&#xff0c;如上图&#xff0c;小孔成像得到的图像是倒立的&#xff0c;但是我们希望得到的图像是正向的&#xff0c;因此&#xff0c;我们选择小孔前成像。 从 3D 到 2D 的投影&#xff0c;…

笔迹鉴定系统

用于笔迹鉴定书的生成。对于检材进行的特征采集&#xff0c;将采集到的特征自动排版&#xff0c;生成比对表&#xff0c;然后在比对表上进行标注。主要标注有&#xff1a;写法、笔顺、箭头、实线、虚线、左括号、右括号、上括号、下括号、运笔、注释、来源、折线、测量、矩形、…

iptables——建立linux安全体系

目录 一. 安全技术类型 二. linux防火墙 1. 按保护范围划分&#xff1a; 2. 按实现方式划分&#xff1a; 3. 按网络协议划分&#xff1a; 4. 防火墙原理 三. 防火墙工具——iptables 1. netfilter 中五个勾子函数和报文流向 数据包传输过程&#xff1a; ① .五表四链…