当前位置: 首页 > news >正文

EasyExcel导入/导出Excel文件

EasyExcel导入/导出Excel文件简单写法


1、导入依赖
2、创建简单导入、导出demo
3、创建类 继承AnalysisEventListener(导入Excel监听解析表格数据)
4、创建类 基于注解 自定义Excel导出模版

1、导入EasyExcel依赖
        
        <!--导入EasyExcel依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
        </dependency>

2、创建简单导入、导出demo

import com.alibaba.excel.EasyExcel;
import com.google.common.collect.Lists;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName ExcelTest
 * @Descripition easyExcel 导入/导出
 * @Author admin
 * @Date 2023/10/9 13:56
 */
public class ExcelTest {

    public static void main(String[] args) {

        ExcelTest excelTest = new ExcelTest();

        // easyExcel 导入Excel表格简单 : Demo
        excelTest.excelReadUtil();

        // easyExcel 导出Excel表格简单 : Demo
        excelTest.excelWriteUtil();

    }


    /**
     * easyExcel 导入Excel表格简单 : Demo
     */
    public void excelReadUtil() {

        // Excel文件地址(自定义个excel文件夹)
        String fileName = "D:\\test\\test001\\desktop\\excel_test.xlsx";
        //记录开始读取Excel时间,也是导入程序开始时间
        long startReadTime = System.currentTimeMillis();
        System.out.println("------开始读取Excel的Sheet时间(包括导入数据过程):" + startReadTime + "ms------");
        //读取所有Sheet的数据.每次读完一个Sheet就会调用这个方法
        /*List<Object> list = EasyExcel.read(fileName, new CustomListener()).headRowNumber(1).doReadAllSync();
        for (Object o : list) {
            System.out.println(o);
        }*/

        // EasyExcel.read(fileName).doReadAll();
        // 多sheet页读取(所有的sheet页)
        // EasyExcel.read(fileName, new CustomListener()).doReadAll();
        // 读取第一个sheet页
        EasyExcel.read(fileName, new CustomListener()).sheet().doRead();
        long endReadTime = System.currentTimeMillis();
        System.out.println("------结束读取Excel的Sheet时间(包括导入数据过程):" + endReadTime + "ms------");
        System.out.println("------读取Excel的Sheet时间(包括导入数据)共计耗时:" + (endReadTime - startReadTime) + "ms------");

    }

Excel导入截图:

控制台输出截图:


    /**
     * easyExcel 导出Excel表格简单 : Demo
     */
    public void excelWriteUtil() {
        //1、创建一个文件对象
        File excelFile = new File("D:\\test\\test001\\desktop\\excel_test1001.xlsx");
        //2、判断文件是否存在,不存在则创建一个Excel文件
        if (!excelFile.exists()) {
            try {
                excelFile.createNewFile();//创建一个新的文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //3、指定需要那个class去写。然后写到第一个sheet,名字为模版,然后文件流会自动关闭
        EasyExcel.write(excelFile, ExcelTemplate.class).sheet("订单模版").doWrite(queryToExcel());
    }


    /**
     * 1、查询数据库获取导出的数据集合
     * 2、集合转换导出模版实体集合:ExcelTemplate
     *
     * @return
     */
    public List<ExcelTemplate> queryToExcel() {
        // 1、查询数据库获取导出的数据集合
        // 模拟业务代码,获取数据集
        List<ExcelTemplate> orders = Lists.newArrayList();
        for (int i = 0; i < 50; i++) {
            ExcelTemplate template1 = new ExcelTemplate(1000L + i, "订单01" + i, "商品名称" + i, "sk1001" + i, 36L + i, 50L + i, "收件人" + i, "北京科技园" + i);
            orders.add(template1);
        }

        // 2、集合转换导出模版实体集合:ExcelTemplate
        List<ExcelTemplate> excels = new ArrayList<>();
        //遍历数据集,导出Excel
        for (int i = 0; i < orders.size(); i++) {
            ExcelTemplate order = orders.get(i);
            ExcelTemplate data = new ExcelTemplate();
            data.setOrderNum(order.getOrderNum());
            data.setOrderName(order.getOrderName());
            data.setGoodsName(order.getGoodsName());
            data.setGoodsNum(order.getGoodsNum());
            data.setPrice(order.getPrice());
            data.setNum(order.getNum());
            data.setUserName(order.getUserName());
            data.setAddress(order.getAddress());
            excels.add(data);
        }
        return excels;
    }

}

Excel导出截图:

3、创建类 继承AnalysisEventListener(导入Excel监听解析表格数据)

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.assertj.core.util.Lists;

import java.util.List;
import java.util.Map;

/**
 * @ClassName CustomListener
 * @Descripition 导入Excel监听解析表格数据
 * @Author admin
 * @Date 2023/10/9 15:40
 */
@Slf4j
public class CustomListener extends AnalysisEventListener {

    // 处理数据: 分批导入阈值
    private static final Long size = 8L;

    // private List<Map<String, String>> list = Lists.newArrayList();
    private List<Object> list = Lists.newArrayList();


    // 每解析一行数据,该方法会被调用一次
    @Override
    public void invoke(Object o, AnalysisContext analysisContext) {
        log.info("Excel每解析一行数据,该方法(invoke)会被调用一次 data : {}", JSON.toJSONString(o));
        // int size = analysisContext.readRowHolder().getCellMap().entrySet().size();
        // System.out.println(size);

        list.add(o);
        if(list.size() >= CustomListener.size){
            for (Object o1 : list) {
                System.out.println(o1);
            }
            System.out.println("处理数据: 分批导入阈值: " + size);
            System.out.println();
            System.out.println();
            list.clear();
        }
    }


    // 全部解析完成被调用
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

        System.out.println("最后剩余数据;不够分割 长度 : " + list.size());
        if(CollectionUtils.isNotEmpty(list)){
            for (Object o : list) {
                System.out.println(o);
            }
            System.out.println();
            list.clear();
        }
        System.out.println("解析数据完成!!!");
        // System.out.println("解析数据完成!!!");
    }
}

4、创建类 基于注解 自定义Excel导出模版

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.*;
import com.alibaba.excel.enums.poi.BorderStyleEnum;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

/**
 * @ClassName ExcelTemplate
 * @Descripition 导出模版
 * @Author admin
 * @Date 2023/10/9 18:14
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@HeadRowHeight(value = 50) // 头部行高
@ContentRowHeight(value = 25) // 内容行高
@ColumnWidth(value = 25) // 列宽
// 头背景设置成红色 IndexedColors.RED.getIndex()
// @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 10)
// 头字体设置成20, 字体默认宋体
@HeadFontStyle(fontName = "仿宋", fontHeightInPoints = 20)
// 头部边框实线
@HeadStyle(borderTop = BorderStyleEnum.THICK,
        borderBottom = BorderStyleEnum.THICK,
        borderLeft = BorderStyleEnum.THICK,
        borderRight = BorderStyleEnum.THICK)
// 内容的背景设置成绿色  IndexedColors.GREEN.getIndex()
// @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
// 内容字体设置成20, 字体默认宋体
@ContentFontStyle(fontName = "楷体", fontHeightInPoints = 20)
// Excel设置内容字体是否水平居中、边框实线
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER,
        borderTop = BorderStyleEnum.MEDIUM,
        borderBottom = BorderStyleEnum.MEDIUM,
        borderLeft = BorderStyleEnum.DOUBLE,
        borderRight = BorderStyleEnum.DOUBLE)
public class ExcelTemplate {


    // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
    // @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 14)
    // 字符串的头字体设置成20
    // @HeadFontStyle(fontHeightInPoints = 20)
    // 字符串的内容背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
    // @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
    // 字符串的内容字体设置成20,默认宋体
    // @ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
    // 设置是否水平居中
    // @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT)
    @ExcelProperty("订单编码")
    private Long orderNum;

    @ExcelProperty("订单名称")
    private String orderName;

    @ExcelProperty("商品名称")
    private String goodsName;

    @ExcelProperty("商品编码")
    private String goodsNum;

    @ExcelProperty("价格")
    private Long price;

    @ExcelProperty("数量")
    private Long num;

    @ExcelProperty("用户名称")
    private String userName;

    @ColumnWidth(value = 80) // 列宽
    @ExcelProperty("收货地址")
    private String address;


}
 

相关文章:

EasyExcel导入/导出Excel文件

EasyExcel导入/导出Excel文件简单写法 1、导入依赖 2、创建简单导入、导出demo 3、创建类 继承AnalysisEventListener&#xff08;导入Excel监听解析表格数据&#xff09; 4、创建类 基于注解 自定义Excel导出模版 1、导入EasyExcel依赖 <!--导入EasyExcel…...

力扣(LeetCode)2512. 奖励最顶尖的K名学生(C++)

优先队列哈希集合反向思维(或自定义排序) 模拟&#xff0c;请直接看算法思路&#xff1a; 两个哈希集合S1和S2, S1存正面词汇&#xff0c;S2存负面词汇&#xff1b;一个优先队列pq&#xff0c;pq存{score, id}键值对&#xff0c;即学生分数-学生id。 算法流程&#xff1a; 初…...

CubeMX+BabyOS 使用方法

MCU&#xff1a;STM32G030F 编译器&#xff1a;MDK 托管工具&#xff1a;Sourcetree CubeMX创建工程 BabyOS克隆 添加子模块 git submodule add https://gitee.com/notrynohigh/BabyOS.git BabyOS 切换dev 分支 查看当前分支 git branch -a 切换本地分支到dev git che…...

OpenResty安装-(基于Nginx的高性能Web平台,可在Nginx端编码业务)

文章目录 安装OpenResty1.安装1&#xff09;安装开发库2&#xff09;安装OpenResty仓库3&#xff09;安装OpenResty4&#xff09;安装opm工具5&#xff09;目录结构6&#xff09;配置nginx的环境变量 2.启动和运行3.备注 安装OpenResty 1.安装 首先你的Linux虚拟机必须联网 …...

算法-DFS+记忆化/动态规划-不同路径 II

算法-DFS记忆化/动态规划-不同路径 II 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/unique-paths-ii 1.2 题目描述 2 DFS记忆化 2.1 思路 注意题意&#xff0c;每次要么往右&#xff0c;要么往下走&#xff0c;也就是说不能走回头路。但是仍有可能走到之前已经…...

黑盒测试方法:原理+实战

目录 一、如何设计测试用例 二、黑盒测试常用方法 1、基于需求进行测试用例的设计 2、等价类 3、边界值 4、判定表分析法&#xff08;因果分析法&#xff09; 5、正交表 6、场景设计法 三、案例补充 1、使用Fiddler模拟弱网 2、针对一个接口该如何测试 一、如何设计测试…...

SQLite事务处理

语法 BEGIN TRANSACTION; COMMIT TRANSACTION; &#xff08;或END TRANSACTION;&#xff09; ROLLBACK TRANSACTION; 事务处理 除了一些PRAGMA语句以外&#xff0c;其它访问数据库的语句会自动启动事务处理&#xff0c;并且在结束时自动提交。 通过上一节的命令可以手动控制…...

Java中CountDownLatch使用场景

在Java的并发API中&#xff0c;CountDownLatch是一个同步器&#xff0c;它允许一个或多个线程等待一组操作完成。 如果您正在开发一个服务器应用程序&#xff0c;该应用程序在开始处理请求之前需要初始化各种资源。这些资源可能是这样的&#xff1a; 加载配置文件建立数据库连…...

漏刻有时数据可视化Echarts组件开发(41)svg格式地图应用

1.定义SVG文件 var svg ;2.注册地图函数 Echarts.registerMap是Echarts图表库中用于注册地图的函数。它可以将第三方地图或自定义地图数据与Echarts进行集成&#xff0c;使用Echarts的API进行绘制。使用方法如下&#xff1a; echarts.registerMap(mapName, geoJson) 参数map…...

firefox的主题文件位置在哪?记录以防遗忘

这篇文章写点轻松的 最近找到了一个自己喜欢的firefox主题,很想把主题的背景图片找到,所以找了下主题文件所在位置 我的firefox版本:版本: 118.0.1 (64 位)主题名称: Sora Kawai 我的位置在 C:\Users\mizuhokaga\AppData\Roaming\Mozilla\Firefox\Profiles\w0e4e24v.default…...

Vuex获取、修改参数值及异步数据处理

14天阅读挑战赛 学不可以已... 目录 一、Vuex简介 1.1 vuex介绍 1.2 vuex核心 二、Vuex使用 2.1 Vuex安装 2.2 创建store模块 2.3 创建vuex的store实例并注册上面引入的各大模块 三、使用Vuex获取、修改值案例 3.1 创建两个菜单组件 3.2 配置路由 3.3 模拟菜单数据 …...

【 OpenGauss源码学习 —— 列存储(autoanalyze)(二)】

列存储&#xff08;autoanalyze&#xff09;&#xff08;二&#xff09; 概述PgStat_StatTabEntry 结构体pgstat_count_heap_insert 与 pgstat_count_cu_insert 函数CStoreInsert::BatchInsertCommon 函数pgstat_count_cu_update 函数pgstat_count_cu_delete 函数pgstat_count_…...

使用postman 调用 Webservice 接口

1. 先在浏览器地址栏 访问你的webService地址 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv?wsdl 2. post man POST 访问wwebService接口 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv <soapenv:Envelope xmlns:soapenv…...

程序员Google插件推荐

文章目录 AdBlock (广告拦截插件)SuperCopy 超级复制Octotree (github增强工具)GitZip for github (github增强工具)JSON-handleSimpleExtManager(管理谷歌插件)OneTab (标签页合并)PostWoman(接口调试)篡改猴 (Tampermonkey)FeHelper(前端助手) AdBlock (广告拦截插件) ☆ 拦截…...

机器学习中常见的监督学习方法和非监督学习方法有哪些。

问题描述&#xff1a;最近面试某些公司算法岗&#xff0c;看到一道简答题&#xff0c;让你举例熟悉的监督学习方法和非监督学习方法。 问题解答&#xff1a; 监督学习方法常见的比较多&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;&#xff1a; 用于回归问…...

UEFI基础——测试用例Hello Word

Hello 测试用例 硬件环境&#xff1a;龙芯ls3a6000平台 软件环境&#xff1a;龙芯uefi固件 GUID获取网址&#xff1a;https://guidgen.com 一、创建工程 mkdir TextPkg/三个文件 Hello.c 、 Hello.inf 、HelloPkg.dsc 1.1 Hello.c /** fileThe application to print hello …...

【tomcat、java】

java&#xff1a;maven配置 1.安装插件 <build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port&…...

京东获取推荐商品列表 API

item_recommend-获取推荐商品列表 请求参数 请求参数&#xff1a;type 参数说明&#xff1a;type:推荐类型 进入API测试页 响应参数 Version: Date: 名称类型必须示例值描述 items items[]0获取推荐商品列表 num_iid Bigint010021415166448宝贝ID detail_url String0http…...

rust cfg的使用

前提是一个crate倒入另一个crate。 先看结构 test_lib目录结构 这与另一个crate处于同一个目录,所以另一crate倒入的时候在Cargo.toml中使用如下语句。 test_lib = {path = "../test_lib" }先在test_lib/src/abc/abc.rs中添加没有cfg的两个函数做测试。 pub fn…...

电脑屏幕怎么录制?5 个最佳免费录屏软件

您是否想使用网络摄像头录制优酷视频、抖音直播或在线课程等项目&#xff0c;但完全不知道如何开始&#xff1f; 不用担心。有很多软件选项可以帮助您。虽然每一款都有不同的功能&#xff0c;但它们都能够录制网络摄像头并输出精美的高质量视频。 以下是我们精选的最佳作品。…...

vscode 调试使用 make 编译的项目

1、首先点击运行 --> 启动调试&#xff1a; 2、选择g或gcc生成和调试活动文件&#xff1a; 3、出现下面提示是正常的&#xff0c;点击仍要调试&#xff1a; 点击打开“launch.json”&#xff1a; 4、此时会在项目工作目录下生成tsak.josn和launch.json文件&#xff1a; 如…...

Docker修改阿里源

在一次安装rtmp推流服务时&#xff0c;总是无法下载源&#xff0c;估计是国外资源下载超时照成的&#xff0c;于是想到修改为国内源。 docker pull alfg/nginx-rtmp Using default tag: latest latest: Pulling from alfg/nginx-rtmp 530afca65e2e: Retrying in 7 seconds c20…...

有必要买一台内衣裤专洗机吗?家用小洗衣机推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…...

高精度与高精度的乘法---基础算法

看到一个博主写得不错&#xff0c;我也照猫画虎&#xff1a;&#xff09; 原因 在计算两个非负整数时&#xff0c;如果位数很大&#xff0c;连 long long 类型都存储不了&#xff0c;就要使用到高精度的乘法 原理 原理依旧是模拟人计算两个数的积&#xff0c;早在小学我们已…...

护眼灯有效果吗?科普护眼灯的作用与推荐

现在我们很多家长对自己孩子的视力十分关心&#xff0c;生怕自己的孩子是近视、远视、弱视等等。对于父母而言&#xff0c;在孩子读书压力大课业重的关键时期&#xff0c;为孩子选择合适的桌椅&#xff0c;保护灯具从而保护孩子的眼睛是非常重要的事情!那么买给孩子读书做功课的…...

【办公自动化】在Excel中按条件筛选数据并存入新的表2.0(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

HDLbits: Lfsr5

我的错误写法&#xff0c;半成品&#xff0c;完全错误&#xff1a; module top_module(input clk,input reset, // Active-high synchronous reset to 5h1output [4:0] q ); dff dff_1(clk, 0 ^ q[0],q[4]);dff dff_2(clk, q[4] ,q[3]);dff dff_3(clk, q[3] ^ q[0] ,q[2]);…...

Visual Studio 错误CS0006:未能找到元数据文件踩坑记录

前言 在写项目的时候&#xff0c;添加了个新的Nuget包&#xff0c;突然就不行&#xff0c;然后就是报错&#xff0c;找不到文件、 出现的原因是因为项目之间互相引用出现了问题&#xff0c;比如如下情况 先版本回退 如果有Git仓库 第一时间去看Git 文件比较&#xff0c;找到…...

tcpdump(三)命令行参数讲解(二)

一 tcpdump实战详解 骏马金龙tcpdump详解 强调&#xff1a; 注意区分选项参数和过滤条件 本文继上篇 网卡没有开启混杂模式 tcpdump默认开启混杂模式 --no-promiscuous-mode --> 可以指定在非混杂模式抓包 ① -vv 控制详细内容的输出 ② -s -s 长度: 可以只…...

面试算法25:链表中的数字相加

题目 给定两个表示非负整数的单向链表&#xff0c;请问如何实现这两个整数的相加并且把它们的和仍然用单向链表表示&#xff1f;链表中的每个节点表示整数十进制的一位&#xff0c;并且头节点对应整数的最高位数而尾节点对应整数的个位数。例如&#xff0c;两个分别表示整数98…...