EasyExcel學習筆記

EasyExcel學習

一、EasyExcel簡介

一、EasyExcel是什么

EasyExcel是一個基于Java的簡單、省內存的讀寫Excel的阿里開源項目。在盡可能節約內存的情況下支持讀寫百M的Excel。

官網:https://easyexcel.opensource.alibaba.com/

學習Easyexcel前需要了解導入和導出是什么意思:

導入:一般我們會把數據從excel到數據庫的過程稱為導入!

導出:一般我們會把數據從數據庫到excel的過程稱為導出!

1.2、 EasyExcel 能用在哪里

項目中涉及到Excel文件,CVS文件大多數的讀寫操作,均可以使用!

1.3、為什么要選用EasyExcel解析excel

在這里插入圖片描述

二、EasyExcel的使用

2.1、快速入門

首先創建項目,并配置maven。

導入easyexcel的依賴:

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

創建一個實體類Employee,與excel表格對應:

/*** 與excel文件相對應的模型類*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {@ExcelProperty("員工編號")private int id;@ExcelProperty("員工姓名")private String name;@ExcelProperty("入職日期")private Date date;@ExcelProperty("員工工資")private double salary;}

這里需要一個工具類,用戶獲取到模塊這一級的磁盤路徑:

/*** 獲取代碼路徑的工具類,可以獲取到模塊這一級的磁盤路徑;*/
public class TestFileUtil {public static String getPath() {return TestFileUtil.class.getResource("/").getPath().replace("classes/","");}
}

簡單寫excel:

首先需要準備測試數據:

// 準備測試數據的方法
private List<Employee> data(int count) {List<Employee> list = ListUtils.newArrayList();for (int i = 1; i <= count; i++) {list.add(new Employee(i,"測試數據"+i,new Date(),6.6*i));}return list;
}

實現寫操作:

@Test
public void write(){//文件的路徑和名字String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";EasyExcel.write(fileName, Employee.class).sheet("模板666").doWrite(data(10)); //sheet:表格名字
}

到對應的路徑下打開excel,查看測試結果:

在這里插入圖片描述

簡單讀excel:

讀操作需要傳入監聽器,這里使用EasyExcel提供的PageReadListener:

@Test
public void read(){String fileName = TestFileUtil.getPath() + "simpleWrite1750300831958.xlsx";EasyExcel.read(fileName, Employee.class, new PageReadListener<Employee>(dataList -> {//讀取數據后對數據執行的操作,這里直接輸出for (Employee demoData : dataList) {System.out.println(demoData);}})).sheet().doRead();
}

在控制臺查看測試結果:

在這里插入圖片描述

2.2、EasyExcel進階操作

批量寫數據:

這里寫100萬數據,每次寫1萬,執行100次:

// 批量寫數據  100萬
@Test
public void write(){String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";try (ExcelWriter excelWriter = EasyExcel.write(fileName, Employee.class).build()) {WriteSheet writeSheet = EasyExcel.writerSheet("測試數據").build();long t1 = System.currentTimeMillis();for (int i = 0; i < 100; i++) {List<Employee> data = data(10000);excelWriter.write(data, writeSheet);}long t2 = System.currentTimeMillis();//測試執行效率:共耗時10秒System.out.println("共耗時" + (t2-t1)/1000 + "秒"); }
}

測試結果顯示寫100萬數據共耗時10秒。

按模版填充單個對象數據:

如果上面寫的數據格式不好看怎么辦?

可以利用阿里提供的模版寫數據,模版設置的樣式新添加的數據會自動包含樣式。

可以使用{}來填充數據:

在這里插入圖片描述

如果傳入的不是單個對象,而是一個集合可以在字段前面加一個點就可以:

在這里插入圖片描述

首先,需要準備一個execl模版:

在這里插入圖片描述

// 批量寫數據  100萬
@Test
public void write(){//分多次填充,會使用文件緩存(省內存)String fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";String templateFileName = TestFileUtil.getPath() + "模版.xlsx";try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {WriteSheet writeSheet = EasyExcel.writerSheet().build();long t1 = System.currentTimeMillis();for (int i = 0; i < 100; i++) {excelWriter.fill(data(10000), writeSheet);}long t2 = System.currentTimeMillis();System.out.println(t2-t1); //測試執行效率}
}

測試結果:

在這里插入圖片描述

自定義監聽器讀海量數據:

自定義監聽器讀數據:

/*** 自定義監聽器讀數據*/
public class EmployeeListener implements ReadListener<Employee> {private int count = 100; //緩存量private ArrayList<Employee> list = new ArrayList<>(count);private EmployeeDao dao;public EmployeeListener(EmployeeDao dao) {this.dao = dao;}/*** 每讀一行數據,都會調用這個方法*/@Overridepublic void invoke(Employee employee, AnalysisContext analysisContext) {// 將讀取到的一行數據添加到集合list.add(employee);// 判斷是不是到達緩存量了if(list.size()>=100){// 操作數據庫dao.save(list);// 清空緩存list= new ArrayList<>(count);}}/*** 讀完整個excel之后,會調用這個方法* 最后list中還會存在元素,執行這個方法處理剩余的元素*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {if(list.size()>0){// 操作數據庫dao.save(list);list= new ArrayList<>(count);}}}

這里只是模擬了一下操作數據庫的操作:

/*** 模擬操作數據庫*/
public class EmployeeDao {public void save(List<Employee> list){System.out.println(list.size()+"模擬操作數據庫......");}
}

讀取海量數據:

/*** 自定義監聽器,讀海量數據*/
public class ManyRead {@Testpublic void read(){String fileName = TestFileUtil.getPath()+"repeatedWrite1750302016738.xlsx";ExcelReader reader = EasyExcel.read(fileName, Employee.class, new EmployeeListener(new EmployeeDao())).build();ReadSheet sheet = EasyExcel.readSheet().build();reader.read(sheet);}}

測試,在控制臺查看輸出結果!

2.3、EasyExcel綜合應用

需求:

  • 實現文件導入功能。

  • 實現文件導出功能。

功能實現:

  1. 配置持久層配置,并引入相關依賴:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///easyexcel?useSSL=false&useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=newpass
  1. 創建實體類Employee:
/*** 員工實體類*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {@ExcelProperty("員工工號")private int id;@ExcelProperty("員工姓名")private String name;@ExcelProperty("員工工資")private double salary;@ExcelProperty("入職日期")private Date date;}
  1. 創建工具類TestFileUtil來獲取文件路徑:
/*** 獲取代碼路徑的工具類,可以獲取到模塊這一級的磁盤路徑;*/
public class TestFileUtil {public static String getPath() {return TestFileUtil.class.getResource("/").getPath().replace("classes/","");}public static void main(String[] args) {System.out.println(getPath());}}
  1. 創建持久層EmployeeMapper:
/*** 持久層*/
public interface EmployeeMapper {/*** 批量插入數據*/void beathInsert(@Param("list") List<Employee> list);/*** 查詢數據*/@Select("select * from employee")@ResultType(Employee.class)List<Employee> getData();}
  1. 創建EmployeeMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmployeeMapper"><!--批量插入數據--><insert id="beathInsert">insert into employee (id,name,salary,date) values<foreach collection="list" item="demoData" separator=",">(null,#{demoData.name},#{demoData.salary},#{demoData.date})</foreach></insert></mapper>
  1. 創建接口層EmployeeService:
/*** Service接口層*/
public interface EmployeeService {public List<Employee> getData();public void addData(List<Employee> list);}
  1. 創建業務實現類EmployeeServiceImpl:
/*** 業務層*/
@Service
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeMapper dao;@Overridepublic List<Employee> getData() {return dao.getData();}@Overridepublic void addData(List<Employee> list) {dao.beathInsert(list);}}
  1. 創建監聽器EmployeeListener:
public class EmployeeListener implements ReadListener<Employee> {private int count = 10000;private EmployeeService dao ;private List<Employee> list = new ArrayList<>(count);public EmployeeListener(EmployeeService dao) {this.dao = dao;}@Overridepublic void invoke(Employee employee, AnalysisContext analysisContext) {list.add(employee);if(list.size()>=count){dao.addData(list);list = new ArrayList<>(count);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {if(list.size()>0){dao.addData(list);}}}
  1. 創建控制層MyController:
@Controller
@RequestMapping("/")
public class MyController {@Autowiredprivate EmployeeService service;/*** Excel讀操作*/@RequestMapping("/upload")@ResponseBodypublic void upload(MultipartFile file, HttpServletResponse response) throws IOException {long t1 = System.currentTimeMillis();//Excel讀操作EasyExcel.read(file.getInputStream(), Employee.class, new EmployeeListener(service)).sheet().doRead();long t2 = System.currentTimeMillis();response.setContentType("text/html;charset=utf-8");response.getWriter().print("導入數據成功,共用時:"+(t2-t1));}/*** Excel寫操作*/@RequestMapping("/download")public void download(HttpServletResponse response) throws IOException {//設置Excel文件下載的類型response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 這里URLEncoder.encode可以防止中文亂碼 當然和easyexcel沒有關系String fileName = URLEncoder.encode("測試666", "UTF-8").replaceAll("\\+", "%20");//Content-disposition:可以控制文件是直接在瀏覽器中顯示還是作為附件下載,這里是直接作為附件下載,文件名字是fileName.xlsxresponse.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//Excel寫操作EasyExcel.write(response.getOutputStream(), Employee.class).sheet("模板").doWrite(service.getData());}}
  1. 測試:

前端頁面:

在這里插入圖片描述

導入100萬條數據的excel,查看數據庫:

在這里插入圖片描述

可以看到,導入100萬數據僅僅耗時26s:

在這里插入圖片描述

并且內存占用為20多兆:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910038.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day4課程

1整體認識和路由配置 2二級分類面包屑導航實現 3基礎商品列表渲染 4列表篩選功能實現 5列表無限加載功能實現 6定制路由滾動行為 7詳情頁整體認識和路由配置 8詳情頁基礎數據渲染 9詳情頁基礎組件封裝和數據渲染 10適配不同title和數據列表 11小圖切換大圖 12滑塊跟隨鼠標移動 …

kubeadm worker節點加入master失敗

文章目錄 1、操作2、問題現象3、問題原因4、問題解決4.1、重新生成token4.2、重新生成hash值 5、驗證 1、操作 執行以下命令&#xff0c;讓worker節點加入到master節點 kubeadm join 103.123.222.241:6443 --token vxe3v1.wzpnks8v1vbbtsu0 --discovery-token-ca-cert-hash s…

二十二、【用戶管理與權限 - 篇四】后端權限定義:模型與 API 實現

【用戶管理與權限 - 篇四】后端權限定義:模型與 API 實現 前言準備工作第一部分:設計并創建 `Permission` 模型第二部分:更新 `Role` 模型以關聯 `Permission`第三部分:生成并應用數據庫遷移第四部分:創建 Serializers第五部分:創建 ViewSets第六部分:注冊 API 路由第七…

猜數字小游戲微信流量主小程序開源

這個智力小游戲采用了數字華容道的玩法&#xff0c;玩家需要通過移動數字方塊&#xff0c;將數字按順序排列完成游戲。代碼嚴格遵循微信小程序的目錄結構&#xff0c;包含以下部分&#xff1a; 完整的小程序配置文件&#xff08;app.js、app.json、app.wxss&#xff09; 游戲頁…

探秘阿里云EBS存儲:云計算的存儲基石

一、引言 在云計算時代&#xff0c;數據如同企業的生命線&#xff0c;數據存儲的重要性不言而喻。隨著企業數字化轉型的加速&#xff0c;海量數據的存儲與高效管理成為亟待解決的問題。云存儲以其卓越的靈活性、可擴展性和成本效益&#xff0c;逐漸成為眾多企業的首選方案。在…

音視頻之H.264的可伸縮編碼SVC

系列文章&#xff1a; 1、音視頻之視頻壓縮技術及數字視頻綜述 2、音視頻之視頻壓縮編碼的基本原理 3、音視頻之H.264/AVC編碼器原理 4、音視頻之H.264的句法和語義 5、音視頻之H.264/AVC解碼器的原理和實現 6、音視頻之H.264視頻編碼傳輸及其在移動通信中的應用 7、音視…

Anaconda安裝env,yml一直卡在Solving environment:不動

如果在使用conda env creat -f env.yml時候&#xff0c;anaconda一直卡住&#xff0c;如下 可以嘗試下面操作。 conda config --set solver libmamba # 使用libmamba引擎&#xff08;Conda≥22.11&#xff09; conda env create -f env.yaml # 重新嘗試

榕壹云婚戀相親系統:ThinkPHP+UniApp打造高效婚配平臺

引言 在數字化浪潮下,婚戀相親行業正加速向線上遷移。榕壹云公司基于市場需求與技術積累,開發一款功能完備、技術開源的婚戀相親小程序系統,為單身人士提供高效、安全的婚戀平臺。本文將圍繞系統背景、客戶定位、核心技術、功能模塊及優勢場景展開詳細解析,助力開發者與技…

查詢docker-compose 部署的milvus 請求日志

在 Docker Compose 部署的 Milvus 中,日志默認存儲在各個服務的容器內。以下是定位和查詢日志的方法: 1. 查看實時日志 使用 docker-compose logs 命令查看實時日志: bash # 查看所有服務的日志 docker-compose logs -f# 僅查看 Milvus 服務日志(服務名以 docker-compos…

Rsync實操

Rsync實操 一.rsync命令 #類似于cp[rootuser2 ~]# rsync info.sh root192.168.168.130:/rootroot192.168.168.130s password: [rootuser1 ~]# lsanaconda-ks.cfg ceph-release-1-1.el7.noarch.rpm info.sh 二、使用rsync備份push方式 服務器&#xff1a;server 192.168.168…

Java常見八股-(6.算法+實施篇)

Java常見八股-&#xff08;1.Java基礎篇&#xff09; Java常見八股-&#xff08;2.Java高級篇&#xff09; Java常見八股-&#xff08;3.MySQL篇&#xff09; Java常見八股-&#xff08;4.前端篇&#xff09; Java常見八股-&#xff08;5.框架篇&#xff09; 目錄 一、算…

阿里云部署的SMTP服務器安全攻防實錄:深度解析攻擊、防護與加固

阿里云部署的SMTP服務器安全攻防實錄&#xff1a;深度解析攻擊、防護與加固 一次針對云上SMTP服務的持續攻擊事件&#xff0c;揭示了郵件中繼服務面臨的多重安全挑戰。本文將深入剖析攻擊手法、防護策略與系統性加固方案。 某企業在阿里云上部署的Postfix SMTP服務器近期遭遇…

HTTP與HTTPS深度解析:從明文傳輸到安全通信的演進之路

引言 在互聯網的早期&#xff0c;HTTP&#xff08;超文本傳輸協議&#xff09;作為Web通信的基石&#xff0c;憑借簡單高效的特性推動了萬維網的爆發式增長。但隨著互聯網從“信息共享”向“價值交互”演進&#xff0c;HTTP的明文傳輸特性逐漸暴露致命缺陷——用戶的每一次點擊…

滲透實戰:繞過沙箱機制的反射型XSS

Lab 24&#xff1a;利用 xss 繞過 csrf 防御 依然是留言板的問題可以執行<h1>標簽 進入修改郵箱的界面&#xff0c;修改抓包 這里構造修改郵箱的代碼 <script> var req new XMLHttpRequest(); req.onload handleResponse; req.open(get,/my-account,true); req…

K8S篇之利用deployment實現滾動平滑升級

一、更新策略 在 Kubernetes (K8s) 中,滾動平滑升級(Rolling Update)是一種無縫更新部署的方式,允許你在不中斷服務的情況下逐步更新應用程序。這是 Kubernetes 默認的 Deployment 更新策略,它會按照指定的步幅逐步替換 Pods,確保在新版本的應用程序沒有完全替換舊版本的…

【Dify 案例】【MCP實戰】【一】【前置配置】

MCP(Model Context Protocol,模型上下文協議) ,2024年11月底,由Anthropic 推出的一種開放標準。旨在為大語言模型(LLM)提供統一的、標準化方式與外部數據源和工具之間進行通信。 MCP 作為一種標準化協議,極大地簡化了大語言模型與外部世界的交互方式,使開發者能夠以統…

2025高考志愿填報張雪峰資料合集

2025高考志愿填報課程&#xff0c;張雪峰專業指導&#xff01;包含61節課&#xff0c;93個專業詳解&#xff0c;總計1500分鐘視頻。 獨家各省資料包&#xff01;新舊高考政策全覆蓋&#xff0c;適合高三家長和考生。內容整理自互聯網&#xff0c;無償分享&#xff0c;如有侵權&…

Nginx+Tomcat負載均衡群集

一.案例:部署Tomcat 1.案例分析 1.1案例概述 京北點指科技有限公司發布V3版移聯建站管理系統&#xff0c;該項目為Java 語言開發的Web 站點。目前&#xff0c;IBM 的 WebSphere 及 0racle 的 WebLogic 占據了市面上 Java 語言 Web 站點的大部分份額。這兩種軟件以其無與倫比…

華為云Flexus+DeepSeek征文|基于華為云一鍵部署dify平臺構建合同審核助手應用實踐

目錄 前言 1 華為云一鍵部署Dify平臺 1.1 華為云Dify平臺介紹 1.2 部署過程介紹 1.3 登錄Dify平臺 2 接入華為云 ModelArts Studio 的 DeepSeek 大模型 2.1 獲取調用模型服務信息 2.2 在 Dify 中配置模型 3 構建合同審核助手應用 3.1 簡要介紹合同審核助手 3.2 開始…

三種經典算法無人機三維路徑規劃對比(SMA、HHO、GWO三種算法),Matlab代碼實現

代碼功能 該MATLAB代碼用于對比三種元啟發式優化算法&#xff08;SMA、HHO、GWO三種算法&#xff0c; SMA黏菌算法、HHO哈里斯鷹優化算法、GWO灰狼優化算法&#xff09; 在特定優化問題上的性能&#xff0c;運行環境MATLABR2020b或更高 &#xff1a; 初始化問題模型&#xff…