工具学习--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.mzph.cn/news/90722.shtml

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

相关文章

Dynamic CRM开发 - 实体窗体(二)主窗体

主窗体是功能最丰富,使用场景最多的窗体。 主窗体界面如下图: 下面按照图中的序号,简述一下窗体的主要功能: 0、窗体的主要布局部分,即用户看到的内容,可以拖动右侧的字段到窗体中想要放置的地方。 默认有标题、常规(选项卡)、页脚三部分,常规处于高亮状态,即可以…

基于微信小程序的物流快递信息查询平台同城急送小程序(亮点:寄件、发票申请、在线聊天)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

云原生Kubernetes:Pod控制器

目录 一、理论 1.Pod控制器 2.Deployment 控制器 3.SatefulSet 控制器 4.DaemonSet 控制器 5.Job 控制器 6.CronJob 控制器 二、实验 1.Deployment 控制器 2.SatefulSet 控制器 3.DaemonSet 控制器 4.Job 控制器 5.CronJob 控制器 三、问题 1. showmount -e 报错…

树莓集团又一力作,打造天府蜂巢成都直播产业园样板工程

树莓集团再次推出惊艳之作&#xff0c;以打造成都天府蜂巢直播产业园为目标。该基地将充分展现成都直播产业园的巨大潜力与无限魅力&#xff0c;成为一个真正的产业园样板工程。 强强联手 打造未来 成都天府蜂巢直播产业园位于成都科学城兴隆湖高新技术服务产业园内&#xff0…

ACGAN

CGAN通过在生成器和判别器中均使用标签信息进行训练&#xff0c;不仅能产生特定标签的数据&#xff0c;还能够提高生成数据的质量&#xff1b;SGAN&#xff08;Semi-Supervised GAN)通过使判别器/分类器重建标签信息来提高生成数据的质量。既然这两种思路都可以提高生成数据的质…

Android 使用kotlin+注解+反射+泛型实现MVP架构

一&#xff0c;MVP模式的定义 ①Model&#xff1a;用于存储数据。它负责处理领域逻辑以及与数据库或网络层的通信。 ②View&#xff1a;UI层&#xff0c;提供数据可视化界面&#xff0c;并跟踪用户的操作&#xff0c;以便通知presenter。 ③Presenter&#xff1a;从Model层获…

FPGA的数字钟带校时闹钟报时功能VHDL

名称&#xff1a;基于FPGA的数字钟具有校时闹钟报时功能 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 1、计时功能:这是数字钟设计的基本功能&#xff0c;每秒钟更新一次,并且能在显示屏上显示当前的时间。 2、闹钟功能:如果当前的时间与闹钟设置的时…

【AI视野·今日NLP 自然语言处理论文速览 第四十四期】Fri, 29 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 29 Sep 2023 Totally 45 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MindShift: Leveraging Large Language Models for Mental-States-Based Problematic Smartphone Use Interve…

软件测试(测试用例攻略)—写用例无压力

一、概念 测试用例的基本概念&#xff1a; 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素 。 主要步骤&#xff1a; 测试环境——测试步骤—…

C理解(二):指针,数组,字符串,函数

本文主要探讨指针&#xff0c;数组&#xff0c;字符串&#xff0c;函数 指针 int *p; 未绑定:*表示p为指针变量,占4字节 int a 1;p &a; 绑定:p与a地址绑定即p中存放a的地址 *p *p 1; 解引用:p间接访问a的存储空间…

【接口测试】HTTP协议

一、HTTP 协议基础 HTTP 简介 HTTP 是一个客户端终端&#xff08;用户&#xff09;和服务器端&#xff08;网站&#xff09;请求和应答的标准&#xff08;TCP&#xff09;。通常是由客户端发起一个请求&#xff0c;创建一个到服务器的 TCP 连接&#xff0c;当服务器监听到客户…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 C: 班级活动

[蓝桥杯 2023 国 B] 班级活动 【问题描述】 小明的老师准备组织一次班级活动。班上一共有 n n n 名&#xff08; n n n 为偶数&#xff09;同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 n n …

以太坊智能合约的历史里程碑: 从DAO到数据隐私的技术演进

文章目录 系列文章目录前言一、时间线 项目介绍总结 前言 在短短的几年内&#xff0c;以太坊不仅成为了去中心化应用和智能合约的主导平台&#xff0c;而且也见证了区块链技术和应用的多次重大革命。本文详细回顾了自2016年至今&#xff0c;以太坊生态所经历的几个关键时刻与技…

leetcodetop100(29) K 个一组翻转链表

K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…

React Native搭建Android开发环境

React Native搭建Android开发环境 搭建Android开发环境一、下载JDK二、安装Android Studio2.1 配置 ANDROID_HOME 环境变量 三、初始化项目 搭建Android开发环境 我的电脑是windows系统&#xff0c;所以只能搭建Android&#xff0c;如果电脑是mac&#xff0c;既可以搭建Androi…

修改sqlmap-Tamper脚本

修改sqlmap-Tamper脚本 文章目录 修改sqlmap-Tamper脚本1 sqlmap官网2 sql注入漏洞注入尝试3 环境&#xff1a;sqli-labs/Less-26a/3.1 尝试宽字节注入: 3.2 sqlmap使用3.3准备修改sqlmap使用 4 sqlmap中-tamper工厂&#xff08;输入输出&#xff09;4.1 [参考文章&#xff1a;…

蓝桥杯 题库 简单 每日十题 day11

01 质数 质数 题目描述 给定一个正整数N&#xff0c;请你输出N以内&#xff08;不包含N&#xff09;的质数以及质数的个数。 输入描述 输入一行&#xff0c;包含一个正整数N。1≤N≤10^3 输出描述 共两行。 第1行包含若干个素数&#xff0c;每两个素数之间用一个空格隔开&…

rust生命期

一、生命期是什么 生命期&#xff0c;又叫生存期&#xff0c;就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误&#xff0c;原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期&#xff0c;蓝色范围’b表示…

pygame实现跳跃发射子弹打怪效果

import pygame import sys,time,random from pygame.locals import * pygame.init() # 设置按下鼠标的时候一直触发 pygame.key.set_repeat(10, 10) # 加载背景图片 bg pygame.image.load(./img/bg.png) # 加载左方向行走和站立图片 heroLStand pygame.image.load(img/heroLs…

传统遗产与技术相遇,古彝文的数字化与保护

古彝文是中国彝族的传统文字&#xff0c;具有悠久的历史和文化价值。然而&#xff0c;由于古彝文的形状复杂且没有标准化的字符集&#xff0c;对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术&#xff0c;旨在提高古彝文的自动识别准确性…