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

news2024/11/19 11:29:20
写在前面:
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"));
        // 查询当前用户id
        Long 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> {
    @Override
    public 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"));
        // 查询当前用户id

        Long 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.coloradmin.cn/o/1039471.html

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

相关文章

简单理解旁路电容和去耦电容

1、本文内容如有错误&#xff0c;欢迎交流指正。 2、本文仅作为本人学习笔记&#xff0c;部分内容来源于网络、书籍&#xff0c;如涉及侵权&#xff0c;请联系删除。 什么是旁路电容&#xff1f; 旁路电容的英文原文是Bypass capacitor&#xff0c;bypass就是绕过&#xff0c;避…

《DATASET CONDENSATION WITH GRADIENT MATCHING》

本文提出了一种用于数据效率学习的训练集合成技术&#xff0c;称为“数据集凝聚”(Dataset)&#xff0c;它学习将大数据集压缩成一个小的信息合成样本集&#xff0c;用于从头开始训练深度神经网络。我们将这个目标表述为在原始数据和合成数据上训练的深度神经网络权值的梯度之间…

sizeof与strlen区别

一、sizeof与strlen区别 sizeof是关键字&#xff0c;参数可以是各种数据&#xff08;包括函数&#xff0c;类型&#xff0c;对象&#xff0c;数组&#xff0c;指针……&#xff09;用于计算数据所占字节大小 strlen是函数&#xff0c;参数类型必须是字符型指针&#xff08;char…

检验过程管理

声明 本文是学习GB-T 42893-2023 电子商务交易产品质量监测实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件提供了开展电子商务交易的有形产品质量监测的总则&#xff0c;监测准备、监测实施、监测效果评价 与反馈等过程指导…

vue在el-tab中使用echart(出现canvas高宽一直是100px问题+echart随外层div变化而自适应)

问题1:canvas高宽一直是100px问题 解决方法&#xff1a;使用v-if&#xff0c;参考文献https://blog.csdn.net/qq_42527726/article/details/106147539?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-106147539-blog-132323416.235^…

全流量安全分析的重要性

网络安全的重要性体现在以下几个方面&#xff1a; 保护数据安全&#xff1a;随着数字化时代的到来&#xff0c;企业和组织的数据变得越来越重要和敏感。网络安全能够有效保护敏感数据不被未授权的访问、篡改或泄露。通过加密、访问控制、身份认证等手段&#xff0c;网络安全确…

Redis怎么测?这篇文章写的太全了

Redis是一个高性能、内存数据库和缓存系统&#xff0c;在开发和生产环境中被广泛应用。本文将介绍如何进行有效的Redis软件测试&#xff0c;以确保其稳定性、高性能和可靠性。 Redis作为一种非关系型数据库和缓存系统&#xff0c;被广泛用于支持高流量、低延迟的应用。为了保证…

从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!

大模型已经成为未来技术发展方向的重大变革&#xff0c;热度之下更需去虚向实&#xff0c;让技术走进产业场景。在这样的背景下&#xff0c;百度智能云于近期发起了“百度智能云千帆大模型平台应用开发挑战赛”。 挖掘大模型落地应用 千帆大模型平台应用开发挑战赛启动 在不久…

短视频无人直播双端开播源码部署

设置语音 商家可以通过语音库&#xff0c;完成直播间语音设置&#xff0c;支持人声录制和智能配音直播间语音 语音库 语音库列表 语音库名称 语音库 录音 合成配音 进入“语音库” 可编辑、删除语音库 列表右下角-添加语音库-输入语音库名称 针对每个语音库&#…

Lua学习笔记:require非.lua拓展名的文件

前言 本篇在讲什么 Lua的require相关的内容 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠…

ChatGPT的问世给哪些行业带来了冲击?

目录 引言Chat GPT 对行业的影响在线客服和智能客服行业传统自动回复机器人的局限性Chat GPT 的提升能力 教育培训行业个性化学习需求的挑战Chat GPT 的个性化优势 金融保险行业客户服务的变革Chat GPT 的智能化应用 医疗健康领域自助诊断及咨询的便利性Chat GPT 在医疗领域的应…

Spring学习笔记11 GoF代理模式

Spring学习笔记10 JdbcTemplate_biubiubiu0706的博客-CSDN博客 新建个maven模块 static-proxy 演示静态代理 订单接口 测试 需求:统计每个业务方法的耗时 package com.example.proxy.service;/*** author hrui* date 2023/9/25 8:42*/ public class OrderServiceImpl implem…

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?

我们在做Android平台轻量级RTSP服务和内网RTSP网关的时候&#xff0c;遇到过这样的问题&#xff0c;如何同时发布多路RTSP流出去&#xff1f; 回答这个问题&#xff0c;实际上不难&#xff0c;大牛直播SDK在设计这个模块的时候&#xff0c;考虑到了一个Service带多路流的情况&…

【Axure高保真原型】滑动评分条_自由控制起始数值

今天和大家分享能自动控制起始数值的滑动评分条的原型模板&#xff0c;我们可以左右拖动滑块或者点击滑条让滑块移动到点击的位置&#xff0c;评分的数值能根据滑块的位置自动计算&#xff1b;我们也可以控制左右侧输入框里的数值&#xff0c;从而控制滑动评分条的区间&#xf…

什么是Peppol ID?如何创建?

Peppol 网络的两大优势是安全和高效&#xff0c;由于Peppol 最常用于电子发票&#xff0c;因此这些优势在电子发票上展露无遗。相比之下&#xff0c;通过电子邮件发送 PDF 格式的发票和其他文件不仅处理成本较高&#xff0c;而且容易出现发票欺诈。 如果您所在的公共部门组织或…

游戏联运和游戏自主运营有什么区别?哪个更好?

游戏联运和游戏自主运营是两种不同的运营模式&#xff0c;各有优劣势&#xff0c;选择取决于具体情况和目标。 一、游戏联运 游戏联运是指将游戏交由第三方发行商或合作伙伴进行运营和推广。这些合作伙伴通常有更丰富的市场经验和资源&#xff0c;能够协助游戏进入不同地区和平…

Linux环境下使用SVN快速访问资料库?试试使用cpolar端口映射

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

LeetCode的第 363 场周赛——记录+补题

研究生生涯第一次打力扣周赛——3题 1. 计算 K 置位下标对应元素的和 class Solution { public:int cnt(int x){int sum 0;while (x) {sum ((x%2)?1:0);x/2;}return sum;}int sumIndicesWithKSetBits(vector<int>& nums, int k) {int n nums.size();int ans 0…