EasyExcel的使用

news2024/12/25 2:39:07

这里写目录标题

  • 先导入依赖
  • 最简单的写
  • 最简单的读
  • 項目开发中的一些操作
  • xml一定要默認放

先导入依赖

<dependencies>

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

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.5</version>
    </dependency>

    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
        <version>3.1.0</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

</dependencies>


最简单的写

建立一个类,然后往模板里输入类,sheet就是excel中那个sheet
在这里插入图片描述
主要就是用到了几个类。

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ExcalWrite {


    @Test
    public void simpleWriteTest(){
        String fileName = "d:/excel/simpleWrite.xlsx"; //需要提前新建目录
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, ExcalStudentDto.class).sheet("新的模板").doWrite(data());
        //sheet是写到ecal的那个sheet里面去
            

    }

    //辅助方法
    private List<ExcalStudentDto> data(){
        List<ExcalStudentDto> list = new ArrayList<>();

        //算上标题,做多可写65536行
        //超出:java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
        for (int i = 0; i < 65535; i++) {
            ExcalStudentDto data = new ExcalStudentDto();
            data.setName("Helen" + i);
            data.setBirthday(new Date());
            data.setSalary(123456.1234);
            list.add(data);
        }

        return list;
    }


}

用LIst对数据进行插入。

xlsx最多写1048575行数据

直接在类上加一些注解
![,可以

直接在类上加注解,可以很好修改放在表里数据的名字

最简单的读

建立一个类作为监听器,时时刻刻监听端口的,数据变化情况

package com.atguigu.easyexcel.listener;

@Slf4j
public class ExcelStudentDTOListener extends AnalysisEventListener<ExcelStudentDTO> {
    
    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(ExcelStudentDTO data, AnalysisContext context) {
        log.info("解析到一条数据:{}", data);

    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("所有数据解析完成!");
    }
}

读数据的操作

  @Test
    public void simpleReadXlsx() {

        String fileName = "d:/excel/simpleWrite.xlsx";
        // 这里默认读取第一个sheet
        EasyExcel.read(fileName, ExcalStudentDto.class, new ExcelStudentDTOListener()).sheet().doRead();
    }

項目开发中的一些操作

首先,我们要创立对应的实体类,数据交换类,用来当做模型存储数据

在这里插入图片描述

必须和excal表中的是一一对应的关系在这里插入图片描述

一般放在pojo中,这个东西。

在这里插入图片描述
別忘了创建一个监听器,用来监听数据
监听器必须继承AnalysisEventListener
注意有泛型,泛型里面必须放,我们要存储和交换的数据模型类

监听器实现这个方法就行

package com.atguigu.srb.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import lombok.extern.slf4j.Slf4j;


@Slf4j
public class ExcelDictDTOListener extends AnalysisEventListener<ExcelDictDTO> {
    /**
     *遍历每一行的记录
     * @param data
     * @param context
     */
    @Override
    public void invoke(ExcelDictDTO data, AnalysisContext context) {
        log.info("解析到一条记录: {}", data);
       
        
    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
     
        log.info("所有数据解析完成!");
    }


}

在服務层写清楚我们的需求
在这里插入图片描述
路径通过一个InputStream传递进去

在这里插入图片描述
在實現類中放上实现的操作。

在Controller中上传

package com.atguigu.srb.core.controller.admin;


import com.atguigu.srb.core.service.DictService;
import com.atguigu.srb.exception.BusinessException;
import com.atguigu.srb.result.R;
import com.atguigu.srb.result.ResponseEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;

@CrossOrigin   //检查跨域
@Api(tags = "数字字典")
@RestController
@RequestMapping("/admin/core/dict")
public class AdminDictController {


    @Resource
    DictService dictService;
    @Resource
    R r;

    @PostMapping("/import")
    @ApiOperation("数据批量导入")
    public R  batchImport(@ApiParam(value = "数据字典文件",required = true)
                            @RequestParam("file")MultipartFile file){

        //拿到一个外面传递进来的InputStream地址

        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();
            dictService.importData(inputStream);
            //数据上传成功
            return r.ok().message("数据字典批量导入成功");
        } catch (IOException e) {
            throw  new BusinessException(ResponseEnum.UPLOAD_ERROR,e);
        }
        dictService.importData(inputStream);

    }
}

在这里插入图片描述

监听器部分优化:

package com.atguigu.srb.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.srb.core.pojo.dto.ExcelDictDTO;
import lombok.extern.slf4j.Slf4j;


@Slf4j
public class ExcelDictDTOListener extends AnalysisEventListener<ExcelDictDTO> {
    /**
     *遍历每一行的记录
     * @param data
     * @param context
     */
    @Override
    public void invoke(ExcelDictDTO data, AnalysisContext context) {
        
        log.info("解析到一条记录: {}", data);


    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库

        log.info("所有数据解析完成!");
    }


}

监听器这里,每次读一条数据data就给封装好,然后往上传递(走一遍流程),读一条,往上传递一次,走一遍流程,效率非常低,我们是不是可以选择,在监听器这个环节,我们读一个List的,将数据存储到一定量在上传?

xml一定要默認放

# 一级目录

防止XML沒裝對位置,可以放這麽一個東西

在依赖里面
在这里插入图片描述
配置了这个就不要把xml文件放在res下面了。

在这里插入图片描述

<build>
    <!-- 项目打包时会将java目录中的*.xml文件也进行打包 -->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

一定要在taget里,看看xml的字节码进来了没有,如果没进来记得mvn去clean一下
clean完了再去看看target进来了没。
然后重新clean,看看target里有没有xml

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

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

相关文章

lombok的原理 和 使用

原理Lombok能以简单的注解形式来简化java代码&#xff0c;提高开发人员的开发效率。其实并没有改变字节码文件的任何内容&#xff0c;只是简化的程序员编写代码的方式。不使用lombok&#xff1a;使用lombok&#xff1a;lombok常用注解Setter &#xff1a;注解在类或字段&#x…

【面试总结】Linux篇·操作及原理篇

【面试总结】Linux篇原理篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型4.如何在Linux上配置一个IP地址5.Linux负载是什么&#xff1f;6.Linux中的软链接和硬链接有什么区别&#xff1f;1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)&#xf…

2自由度悬架LQR控制

目录 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 1.3 路面激励 2.仿真分析 2.1simulink模型 2.2 仿真结果 2.3 结论 3. 总结 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 其中&#xff1a;x1为悬架动扰度&#xff0c;x2为车身加速度&#xff0c;x3为轮胎…

红黑树的历史和由来。

一个数组&#xff0c;1,2,3,4,5,...n; 一共n个数字。1、直接查找想要查询第n个数字&#xff0c;直接搜索&#xff0c;就是n次查询。ps:那么问题来了&#xff0c;这样查询也太慢了&#xff0c;有什么改进的呢&#xff1f;2、二分查找这个时候&#xff0c;二分查找更快。不过就是…

python中的.nc文件处理 | 04 利用矢量边界提取NC数据

利用矢量边界提取.nc数据 import osimport numpy as np import pandas as pd import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature import seaborn as sns import geopandas as gpd import earthpy as et import xarray as xr # …

渲染有问题?怎么办?6种方法让你渲染无忧

简单点&#xff0c;解决问题的方式简单点。 日常工作中我们总会遇到各种各样的问题&#xff0c;比如渲不出图&#xff0c;速度太慢或效率太低&#xff0c;各种噪点和黑图等等&#xff0c;烦不胜烦&#xff0c;今天我就针对6个常见的问题给大家说下方法&#xff0c;一家之言仅供…

ASP .NET(基于.NET 6.0)源码解读

这几天一直在琢磨在我现有技术认知基础上&#xff0c;未来如何做技术提升。 日思夜想&#xff0c;我整理出了我自己的一套学习规划方案&#xff0c;并希望在实施过程中能够不断调整学习方案与方式&#xff0c;以接近自我提升的效率最大化。 从以下几个大的方面来得到提升&…

特征检测之HOG特征算法详解及Opencv接口使用

1. HOG特征简介 特征描述符是图像或图像补丁的表示形式&#xff0c;它通过提取有用信息并丢弃无关信息来简化图像。 通常&#xff0c;特征描述符将大小W x H x 3&#xff08;通道&#xff09;的图像转换为长度为n的特征向量/数组。对于 HOG 特征描述符&#xff0c;输入图像的…

ChatGPT会让程序员失业?ChatGPT:“ 是友军,我不从事任何职业。

毫无疑问&#xff0c;ChatGPT“出圈”了。 它似乎无所不能。 许多人担忧它是否会取代自己的饭碗&#xff0c;唯恐自己的进步赶不上 AI 的发展。 然而&#xff0c;有人在试用几次之后&#xff0c;又算是松了口气&#xff1a;打工人我呀&#xff0c;工作算是保住啦~ 那么&…

Lesson5.3---Python 之 NumPy 统计函数、数据类型和文件操作

一、统计函数 NumPy 能方便地求出统计学常见的描述性统计量。最开始呢&#xff0c;我们还是先导入 numpy。 import numpy as np1. 求平均值 mean() mean() 是默认求出数组内所有元素的平均值。我们使用 np.arange(20).reshape((4,5)) 生成一个初始值默认为 0&#xff0c;终止…

ArcGIS笔记3_如何编辑、修改和导出散点数据

本文目录前言Step 1 在ArcGIS中添加并显示坐标点Step 2 将坐标数据保存成shp文件Step 3 编辑或修改坐标数据Step 4 导出修改后的数据&#xff1a;法一&#xff1a;通过转换工具导出Step 5 导出修改后的数据&#xff1a;法二&#xff1a;通过dBASE表导出前言 本博文更多针对Arc…

【函数栈帧的创建和销毁】 -- 神仙级别底层原理,你学会了吗?

文章目录1.函数的调用方式 2.函数在栈区上的动作 1.函数的调用方式 相信你对调用函数一点都不陌生&#xff0c;但是在调用函数的过程中&#xff0c;却存在着很多你无法见到的东西&#xff0c;这是底层信息&#xff0c;想要理解透彻&#xff0c;就得深入底层去观察。 本文以…

Spring之AOP底层源码解析

Spring之AOP底层源码解析 1、动态代理 代理模式的解释&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff0c;增强一个类中的某个方法&#xff0c;对程序进行扩展。 举个例子 public class UserService {public void test() {System.out.println("test.…

LeetCode-216. 组合总和 III

目录题目分析回溯三部曲剪枝优化题目来源 216. 组合总和 III 题目分析 这个和leetcode77组合类似 本题k相当于树的深度&#xff0c;9&#xff08;因为整个集合就是9个数&#xff09;就是树的宽度。 例如 k 2&#xff0c;n 4的话&#xff0c;就是在集合[1,2,3,4,5,6,7,8,9]中…

我的车载开发—{ carservice启动流程 }—

carservice启动流程 大致流程&#xff1a; SystemServer启动CarServiceHelperService服务在调用startService后&#xff0c;CarServiceHelperService的onStart方法通过bindService的方式启动CarService&#xff08;一个系统级别的APK&#xff0c;位于system/priv-app&#xf…

转转测试环境docker化实践

测试环境对于任何一个软件公司来讲&#xff0c;都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境docker稳定环境环境体系。期间环境系统不断的演进&#xff0c;去适应转转集群扩张、新业务的扩展&#xff0c;走了一些…

Linux系统基本设置:网络设置(三种界面网络地址配置)

网络地址配置&#xff1a;图形界面配置、命令行界面配置、文本图形界面配置 命令行界面配置 查看网络命令&#xff1a; 想要知道你有多少网卡&#xff0c;都可以通过这两个命令来查看 手动设置网络参数&#xff0c;我们可以使用nmcli这个命令来设置&#xff0c;我们需要知道…

【react实战小项目:笔记】用React 16写了个订单页面

视频地址 React 16 实现订单列表及评价功能 简介&#xff1a;React 以其组件化的思想在前端领域大放异彩&#xff0c;但其革命化的前端开发理念对很多 React 初学者来说&#xff0c; 却很难真正理解和应用到真实项目中。本课程面向掌握了 React 基础知识但缺乏实战经验的开发…

状态机分析

写在前面 状态机是指某事物具有有限状态&#xff0c;且在这些状态之间相互转换的抽象&#xff0c;比如门的开是一个状态&#xff0c;关又是一个状态。本文就一起来看下。 1&#xff1a;状态机的术语 1.1&#xff1a;state 状态&#xff0c;即当前所处的状态&#xff0c;如汽…

电子技术——内部电容效应以及MOS与BJT的高频响应模型

电子技术——内部电容效应以及MOS与BJT的高频响应模型 耦合和旁路电容决定了放大器的低频响应&#xff0c;同时内部电容效应决定了放大器的高频响应。本节&#xff0c;我们简单简单介绍一下内部电容效应&#xff0c;并且更重要的是如何在小信号模型中模型化内部电容效应。 MOS…