工具学习--easyexcel-3.x 使用--写入基本使用,自定义转换--动态表头以及宽设置-

写在前面:
easyexcel是alibaba开发简单导出未excel的工具。使用的情况还是比较多的。

文章目录

  • 依赖导入
  • 写Excel
    • 快速入门
    • 对象设置
      • @ExcelProperty设置列属性
      • @ExcelIgnore 忽视
      • 列宽、行高
      • 格式转换
        • 时间格式化
        • 数字格式化
        • 自定义格式化
      • 合并单元格
      • 其他更加个性化需求
      • 动态表头以及其宽高设置
  • 读excel

依赖导入

使用一个工具第一步肯定是导入,pom导入下面依赖

        <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency>

写Excel

快速入门

一般在controller进行
需要HttpServletResponse且返回值为null。

    @GetMapping("_export")public void exportUsers(Query query, HttpServletResponse response) throws IOException {// 导出文件名String fileName = "短信记录.xlsx";// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));// 查询当前用户idLong userId = SecurityUtils.getUser().getUserId();// 查询数据List<Record> page = service.lambdaQuery().page(query.getPage()).getRecords();// 写入数据EasyExcel.write(response.getOutputStream(), Record.class).sheet("sheet标题").doWrite(page);}

对象设置

入门的输出,我们会发现所有属性都输出了,且是按照属性名作为列名,这一般不是我们所需要的。

所以自定义的设置就很需要了。设置是通过在实体类上写注解来设置的。

@ExcelProperty设置列属性

  • value
    列名称,改属性。
    也可以复杂头进行输出,如{“主标题”, “标题1”},{“主标题”, “标题2”},这样设置。
    那么样式就会是差不多下面这样
    在这里插入图片描述

  • index
    设置改属性在列的索引,默认-1,按照java类属性的顺序进行。从0开始。
    如果填不满的也不会顺序递增,如index 设置了0,1,3那么第3列(索引2)会为空.

  • order
    定义列的排序顺序。优先级:索引>顺序>默认排序

  • converter
    自定义转换器,这个后面在放大的讲。

@ExcelIgnore 忽视

设置后将不在输出该属性。

列宽、行高

可以放到放到类设置通用的列高,也可以在属性上设置这个属性的列宽。
-1为自动

  • ColumnWidth列宽
  • ContentRowHeight 列高
  • HeadRowHeight头高

格式转换

时间格式化

@DateTimeFormat(“yyyy年MM月dd日HH时mm分ss秒”)

数字格式化

@NumberFormat

  • style
    用于设置字段格式的样式模式。可以通过NumberFormat.Style枚举,默认 NumberFormat.Style.DEFAULT
    style枚举
    • DEFAULT 注释类型的默认格式:通常是“数字”,但货币类型可能是“货币
    • NUMBER 当前区域设置的通用数字格式。
    • PERCENT 当前区域设置的百分比格式。
    • CURRENCY 当前区域设置的货币格式。
  • pattern
    用于设置字段格式的自定义模式。例如 #, ###.##。
自定义格式化

使用ExcelProperty的converter 属性,属性值为自定义转换器

自定义转换器类,需要继承Converter 泛型T为对于的java属性类型
对于写重写下面这一个就能用了
WriteCellData<?> convertToExcelData(Boolean value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception

如:我需要转换一个boolean类型,true则输出成功false失败

public class BooleanConverter implements Converter<Boolean> {@Overridepublic WriteCellData<?> convertToExcelData(Boolean value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {System.out.println(value);return value ? new WriteCellData<>("成功") : new WriteCellData<>("失败");}}

合并单元格

  • 属性
    这一列 每隔2行 合并单元格
    @ContentLoopMerge(eachRow = 2)

  • 将第6-7行的2-3列合并成一个单元格
    @OnceAbsoluteMerge(firstRowIndex = 5, lastRowIndex = 6, firstColumnIndex = 1, lastColumnIndex = 2)

其他更加个性化需求

参考官方文档,我感觉其他的用到的很少,到时候翻一下就可以了

如果有用到会在下面继续更新

动态表头以及其宽高设置

需求,表头的列数量不确定,且需要设置表头的宽度为20.
我这里是一个每天的计数统计,依据用户输入的时间间隔生成列。
这里直接给代码了,里面有注释比较容易看。

        // 导出文件名String fileName = "短信统计.xlsx";// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));// 查询当前用户idLong userId = SecurityUtils.getUserId();// 查询数据LocalDate start = query.getStartTime().toLocalDate();LocalDate end = query.getEndTime().toLocalDate();ColumnsResult<CountRecordBO> result = null;if (StrUtil.equals(type, "0")) {result = service.countRecordByDay(start, end, query.getPageNum(), query.getPageSize());} else if (StrUtil.equals(type, "1")) {result = service.countRecordByMonth(start, end, query.getPageNum(), query.getPageSize());} else {throw new IllegalArgumentException("type参数错误");}// 生成表头List<List<String>> header = new ArrayList<>();List<String> head0 = new ArrayList<>(1);head0.add("手机号");List<String> head1 = new ArrayList<>(1);head1.add("总数");header.add(head0);header.add(head1);result.getColumns().forEach(i -> {List<String> head = new ArrayList<>(1);head.add(i);header.add(head);});// 生成数据List<List<String>> data = result.getData().stream().map(count -> {List<String> columns = new ArrayList<>();columns.add(count.getPhone());columns.add(count.getCount().toString());columns.addAll(count.getList().stream().map(Object::toString).collect(Collectors.toList()));return columns;}).collect(Collectors.toList());// 写入数据EasyExcel.write(response.getOutputStream())// 设置宽度.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)).head(header).sheet("短信记录").doWrite(data);

读excel

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

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

相关文章

【Java 进阶篇】MySQL多表关系详解

MySQL是一种常用的关系型数据库管理系统&#xff0c;它允许我们创建多个表格&#xff0c;并通过各种方式将这些表格联系在一起。在实际的数据库设计和应用中&#xff0c;多表关系是非常常见的&#xff0c;它能够更好地组织和管理数据&#xff0c;实现数据的复杂查询和分析。本文…

react+IntersectionObserver实现页面丝滑帧动画

实现效果&#xff1a; 加入帧动画前&#xff1a; 普通的静态页面 加入帧动画后&#xff1a; 可以看到&#xff0c;加入帧动画后&#xff0c;页面效果还是比较丝滑的。 技术实现 加入animation动画类 先用 **scss **定义三种动画类&#xff1a; .withAnimation {.fade1 {ani…

JavaScript Web APIs第二天笔记

Web APIs - 第2天 学会通过为DOM注册事件来实现可交互的网页特效。 能够判断函数运行的环境并确字 this 所指代的对象理解事件的作用&#xff0c;知道应用事件的 3 个步骤 学习会为 DOM 注册事件&#xff0c;实现简单可交互的网页特交。 事件 事件是编程语言中的术语&#xff…

Word | 简单可操作的快捷公式编号、右对齐和引用方法

1. 问题描述 在理工科论文的写作中&#xff0c;涉及到大量的公式输入&#xff0c;我们希望能够按照章节为公式进行编号&#xff0c;并且实现公式居中&#xff0c;编号右对齐的效果。网上有各种各样的方法来实现&#xff0c;操作繁琐和简单的混在一起&#xff0c;让没有接触过公…

Visual Studio 代码显示空格等空白符

1.VS2010: 快捷键&#xff1a;CtrlR,W 2.VS2017、VS2019、VS2022&#xff1a; 工具 -> 选项 -> 文本编辑器 -> 显示 -> 勾选查看空白

解决webpack报错:You forgot to add ‘mini-css-extract-plugin‘ plugin

现象&#xff1a; 原因&#xff1a; webpack5.72跟mini-css-extract-plugin有兼容性问题 解决办法&#xff1a;把 new MiniCssExtractPlugin()放在webpack配置文件中plugins数组的第一项&#xff1a; plugins: [ // 此处解决报错&#xff1a;You forgot to add mini-css-extra…

Java项目-文件搜索工具

目录 项目背景 项目效果 SQLite的下载安装 使用JDBC操作SQLite 第三方库pinyin4j pinyin4j的具体使用 封装pinyin4j 数据库的设计 创建实体类 实现DBUtil 封装FileDao 设计scan方法 多线程扫描 周期性扫描 控制台版本的客户端 图形化界面 设计图形化界面 项目…

最新AI创作系统源码ChatGPT源码+附详细搭建部署教程+AI绘画系统+支持国内AI提问模型

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

二十二,加上各种贴图

使用pbr的各种贴图&#xff0c;albedo,金属度&#xff0c;ao,法线&#xff0c;粗糙度&#xff0c;可以更好的控制各个片元 1&#xff0c;先加上纹理坐标 texCoords->push_back(osg::Vec2(xSegment, ySegment)); geom->setVertexAttribArray(3, texCoords, osg::Array::BI…

WebPack-打包工具

从图中我们可以看出&#xff0c;Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件&#xff0c;减少了页面的请求. 下面举个例子 &#xff1a; main.js 我们只命名导出一个变量 export const name"老六"index.js import { name } from "./tset/…

聊聊并发编程——Condition

目录 一.synchronized wait/notify/notifyAll 线程通信 二.Lock Condition 实现线程通信 三.Condition实现通信分析 四.JUC工具类的示例 一.synchronized wait/notify/notifyAll 线程通信 关于线程间的通信&#xff0c;简单举例下&#xff1a; 1.创建ThreadA传入共享…

Vue之ElementUI实现登陆及注册

目录 ​编辑 前言 一、ElementUI简介 1. 什么是ElementUI 2. 使用ElementUI的优势 3. ElementUI的应用场景 二、登陆注册前端界面开发 1. 修改端口号 2. 下载ElementUI所需的js依赖 2.1 添加Element-UI模块 2.2 导入Element-UI模块 2.3 测试Element-UI是否能用 3.编…

【VUE复习·9】v-for 基础用法(循环渲染也叫列表渲染)

总览 1.v-for 都能循环什么 2.用法 一、v-for 都能遍历什么 能循环的东西包括&#xff1a;数组、对象、字符串&#xff08;和java里面的3个引用数据类型一样&#xff09;、纯粹循环数量&#xff08;少用&#xff09; 二、用法 1.用法1&#xff1a;简单循环&#xff08;遍历…

Activiz 9.2 for Linux Crack

Activiz 9.2 在 C#、.Net 和 Unity 软件中为您的 3D 内容释放可视化工具包的强大功能。 ActiViz 允许您轻松地将 3D 可视化集成到您的应用程序中。 ActiViz 功能 用 C# 封装的 3D 可视化软件系统 允许在 .NET 环境中快速开发可投入生产的交互式3D 应用程序 支持窗口演示基础 (…

SI3262:国产NFC+MCU+防水触摸按键三合一SoC芯片

目录 SI3262简介特点结构框图芯片特性 SI3262简介 Si3262是高度集成ACD低功耗MCUNFC15通道防水触摸按键的SoC芯片。 其MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等丰富的…

紫光展锐6nm国产5G处理器T820_国产手机芯片5G方案

紫光展锐T820是一款采用先进6nm EUV工艺的芯片&#xff0c;采用134三丛集八核心CPU架构&#xff0c;由1个主频为 2.7GHz 的 Arm Cortex-A76 大核和 3个主频为2.3GHz 的Arm Cortex-A76大核以及4个主频为2.1GHz的 Arm Cortex-A55组成 &#xff0c;支持高达3MB 三级缓存&#xff0…

jvm内存分配与回收策略

自动内存管理 解决两个问题 自动给对象分配内存 对象一般堆上分配&#xff08;而实际上也有可能经过即时编译后被拆散为标量类型并间接地在栈上分配&#xff09; 新生对象通常会分配在新生代&#xff0c;少数情况下&#xff08;例如对象大小超过一定阈值&#xff09;也可能…

[C++网络协议] 优于select的epoll

1.epoll函数为什么优于select函数 select函数的缺点&#xff1a; 调用select函数后&#xff0c;要针对所有文件描述符进行循环处理。每次调用select函数&#xff0c;都需要向该函数传递监视对象信息。 对于缺点2&#xff0c;是提高性能的最大障碍。因为&#xff0c;套接字是…

Python爬虫实战案例——第六例

文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff01;严禁将文中内容用于任何商业与非法用途&#xff0c;由此产生的一切后果与作者无关。若有侵权&#xff0c;请联系删除。 目标&#xff1a;去哪儿网指定城市人气值最高的15个景点评论数据采集 地址&a…

微信小程序开发基础(二)基本组件

本帖开始介绍小程序中的一些基本组件~ 微信小程序是一种轻量、快速、跨平台的应用程序&#xff0c;是微信公众号的重要组成部分。随着微信小程序的普及&#xff0c;越来越多的开发者和企业开始使用微信小程序来搭建自己的应用&#xff0c;但是对于初次接触微信小程序的开发者…