Java基于EasyExcel实现读取Excel文件详解
1.引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.11</version>
</dependency>2.读取器代码:
package com.visy.utils;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.cache.MapCache;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
/**
* @author visy.wang
* @description: Excel读取器
* @date 2023/8/18 11:03
*/
@Slf4j
public class ExcelReader {
public static void read(
String fileName,
Consumer<RowData> reader,
Consumer<Integer> terminator
){
NoModelDataListener listener = NoModelDataListener.create(reader, terminator);
EasyExcel.read(fileName, listener).readCache(new MapCache()).sheet().doRead();
}
public static void read(
String fileName,
Consumer<RowData> reader
){
read(fileName, reader, null);
}
public static void read(
MultipartFile file,
Consumer<RowData> reader,
Consumer<Integer> terminator
) throws IOException {
NoModelDataListener listener = NoModelDataListener.create(reader, terminator);
EasyExcel.read(file.getInputStream(), listener).readCache(new MapCache()).sheet().doRead();
}
public static void read(
MultipartFile file,
Consumer<RowData> reader
) throws IOException {
read(file, reader, null);
}
private static class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {
private int totalRows = 0;//读取总行数
private static final int BATCH_SIZE = 1000; //分批次,每一次读取的行数
private final Map<Integer, String> headMap = new HashMap<>();
private final List<RowData> list = new ArrayList<>(BATCH_SIZE);
private final Consumer<RowData> reader;
private final Consumer<Integer> terminator;
public static NoModelDataListener create(
Consumer<RowData> reader,
Consumer<Integer> terminator
){
return new NoModelDataListener(reader, terminator);
}
private NoModelDataListener(
Consumer<RowData> reader,
Consumer<Integer> terminator
){
this.reader = reader;
this.terminator = terminator;
}
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
totalRows ++; //统计数据行数(排除表头)
invoke(data, context.readRowHolder().getRowIndex());
}
@Override
public void invokeHeadMap(Map<Integer, String> head, AnalysisContext context) {
headMap.putAll(head);//记录表头
invoke(head, context.readRowHolder().getRowIndex());
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
flush();
if(Objects.nonNull(terminator)){
terminator.accept(totalRows);
}
}
private void flush(){
if(!list.isEmpty()){
doRead();
}
}
private void invoke(Map<Integer, String> data, Integer rowIndex){
list.add(RowData.builder().rowIndex(rowIndex).data(format(data)).build());
if(list.size() >= BATCH_SIZE){
doRead();
list.clear();
}
}
private void doRead(){
list.forEach(reader);
}
private Map<String,String> format(Map<Integer, String> row){
Map<String,String> result = new HashMap<>();
if(headMap.isEmpty()){
row.forEach((colIndex, value) -> {
result.put("Column"+colIndex, value);
});
return result;
}
headMap.forEach((colIndex, title) -> {
String value = row.get(colIndex);
result.put(title.trim(), value);
});
return result;
}
}
@Data
@Builder
public static class RowData {
private Integer rowIndex;
private Map<String, String> data;
/**
* 翻译
* @param dict 字典<excel标题,自定义字段名>
* @return 翻译后的data
*/
public Map<String,String> translate(Map<String,String> dict){
if(dict==null || dict.isEmpty()){
return data;
}
String newKey;
for (String key : data.keySet().toArray(new String[0])) {
if((newKey = dict.get(key)) != null){
data.put(newKey, data.remove(key));
}
}
return data;
}
}
}
3.测试
package com.visy.utils;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
/**
* @author visy.wang
* @date 2024/9/29 18:11
*/
@Slf4j
public class ExcelReaderTest {
public static void main(String[] args) {
String fileName = "D:\\test\\订单.xls";
Map<String, String> dict = new HashMap<>();
dict.put("项目编码", "projectNo");
dict.put("订单编号", "orderNo");
ExcelReader.read(fileName, rowData -> {
int rowNo = rowData.getRowIndex();
if(rowNo == 0){
log.info("第{}行,表头:{}", rowNo+1, JSON.toJSONString(rowData.translate(dict)));
}else{
log.info("第{}行,数据:{}", rowNo+1, JSON.toJSONString(rowData.translate(dict)));
}
}, total -> {
log.info("所有数据已读取完毕!!!");
log.info("一共读取了{}行数据", total);
});
}
}
4.输出
18:16:48,806 INFO ExcelReaderTest:23 - 第1行,表头:{"序号":"序号","orderNo":"订单编号","projectNo":"项目编码","本次打款总金额":"本次打款总金额","结算单号":"结算单号"}
18:16:48,808 INFO ExcelReaderTest:25 - 第2行,数据:{"序号":"1","orderNo":"ZC1839511598451183623","projectNo":"KPZCJ1337083789442","本次打款总金额":"8.00元","结算单号":"GSD1839485349116825600"}
18:16:48,809 INFO ExcelReaderTest:25 - 第3行,数据:{"序号":"2","orderNo":"ZC1839511598451183623","projectNo":"KPZCJ1337083789442","本次打款总金额":"8.00元","结算单号":"GSD1839485422676529152"}
18:16:48,809 INFO ExcelReaderTest:25 - 第4行,数据:{"序号":"3","orderNo":"ZC1839504517895606281","projectNo":"XDFW1409599599521","本次打款总金额":"660.00元","结算单号":"GSD1839504154316558336"}
18:16:48,809 INFO ExcelReaderTest:25 - 第5行,数据:{"序号":"4","orderNo":"ZC1839504517895606281","projectNo":"XDFW1409599599521","本次打款总金额":"660.00元","结算单号":"GSD1839504199178833920"}
18:16:48,810 INFO ExcelReaderTest:25 - 第6行,数据:{"序号":"5","orderNo":"ZC1839504517895606281","projectNo":"XDFW1409599599521","本次打款总金额":"660.00元","结算单号":"GSD1839504234847195136"}
18:16:48,810 INFO ExcelReaderTest:25 - 第7行,数据:{"序号":"6","orderNo":"ZC1821415146298589186","projectNo":"DY11432043204258","本次打款总金额":"10.30元","结算单号":"GSD1821414066009456640"}
18:16:48,810 INFO ExcelReaderTest:25 - 第8行,数据:{"序号":"7","orderNo":"ZC1808791262713888770","projectNo":"KPZCJ14131713172905","本次打款总金额":"2.40元","结算单号":"GSD1808752241082122240"}
18:16:48,811 INFO ExcelReaderTest:25 - 第9行,数据:{"序号":"8","orderNo":"ZC1803003717728751618","projectNo":"KPZCJ17264326435074","本次打款总金额":"4.22元","结算单号":"GSD1803002522666684416"}
18:16:48,811 INFO ExcelReaderTest:25 - 第10行,数据:{"序号":"9","orderNo":"ZC1802909083988021250","projectNo":"KPZCJ10285028505852","本次打款总金额":"140.18元","结算单号":"GSD1802908824310272000"}
18:16:48,811 INFO ExcelReaderTest:25 - 第11行,数据:{"序号":"10","orderNo":"ZC1752938634642669569","projectNo":"DY16231023106597","本次打款总金额":"326.94元","结算单号":"GSD1752938314889904128"}
18:16:48,811 INFO ExcelReaderTest:25 - 第12行,数据:{"序号":"11","orderNo":"ZC1751809098261639169","projectNo":"DY11211521153170","本次打款总金额":"165.11元","结算单号":"GSD1751806326732709888"}
18:16:48,811 INFO ExcelReaderTest:25 - 第13行,数据:{"序号":"12","orderNo":"ZC1751803125170135042","projectNo":"DY11211521153170","本次打款总金额":"990.66元","结算单号":"GSD1751802752413949952"}
18:16:48,811 INFO ExcelReaderTest:25 - 第14行,数据:{"序号":"13","orderNo":"ZC1749719747436433410","projectNo":"DY16524552459874","本次打款总金额":"79.66元","结算单号":"GSD1749719630004310016"}
18:16:48,811 INFO ExcelReaderTest:25 - 第15行,数据:{"序号":"14","orderNo":"ZC1748169486398042114","projectNo":"DY1004364367372","本次打款总金额":"199.13元","结算单号":"GSD1748167443449032704"}
18:16:48,812 INFO ExcelReaderTest:25 - 第16行,数据:{"序号":"15","orderNo":"ZC1747882440458670080","projectNo":"DY11121112110728","本次打款总金额":"36.32元","结算单号":"GSD1747882279347064832"}
18:16:48,813 INFO ExcelReaderTest:25 - 第17行,数据:{"序号":"16","orderNo":"ZC1747874805231616001","projectNo":"DY11121112110728","本次打款总金额":"36.32元","结算单号":"GSD1747874605553385472"}
18:16:48,813 INFO ExcelReaderTest:25 - 第18行,数据:{"序号":"17","orderNo":"ZC1734088151878545408","projectNo":"DY11104310438950","本次打款总金额":"22.00元","结算单号":"GSD1734087575031721984"}
18:16:48,813 INFO ExcelReaderTest:25 - 第19行,数据:{"序号":"18","orderNo":"ZC1734049237461590018","projectNo":"DY11104310438950","本次打款总金额":"22.00元","结算单号":"GSD1734049137159004160"}
18:16:48,813 INFO ExcelReaderTest:25 - 第20行,数据:{"序号":"19","orderNo":"ZC16999558515156526","projectNo":"KPZCJ16141014108222","本次打款总金额":"7.07元","结算单号":"GSD16996681699402290"}
18:16:48,813 INFO ExcelReaderTest:25 - 第21行,数据:{"序号":"20","orderNo":"ZC16999548202909446","projectNo":"KPZCJ16141014108222","本次打款总金额":"2.02元","结算单号":"GSD16996686241470609"}
18:16:48,813 INFO ExcelReaderTest:25 - 第22行,数据:{"序号":"21","orderNo":"ZC16994333820644684","projectNo":"DY16445644569459","本次打款总金额":"6.00元","结算单号":"GSD16994333480323046"}
18:16:48,813 INFO ExcelReaderTest:25 - 第23行,数据:{"序号":"22","orderNo":"ZC16994329855599490","projectNo":"DY16361336133168","本次打款总金额":"12.00元","结算单号":"GSD16994328986634071"}
18:16:48,813 INFO ExcelReaderTest:25 - 第24行,数据:{"序号":"23","orderNo":"ZC16994311498202085","projectNo":"DY15303630362489","本次打款总金额":"6.00元","结算单号":"GSD16994289014792143"}
18:16:48,814 INFO ExcelReaderTest:25 - 第25行,数据:{"序号":"24","orderNo":"ZC16994307629649811","projectNo":"DY15261026100064","本次打款总金额":"12.00元","结算单号":"GSD16994302164484906"}
18:16:48,814 INFO ExcelReaderTest:25 - 第26行,数据:{"序号":"25","orderNo":"ZC16927707974275190","projectNo":"DY110400409587","本次打款总金额":"79.66元","结算单号":"GSD16927707572422541"}
18:16:48,815 INFO ExcelReaderTest:25 - 第27行,数据:{"序号":"26","orderNo":"ZC16925872256331116","projectNo":"DY110400409587","本次打款总金额":"79.66元","结算单号":"GSD16925872037735498"}
18:16:48,815 INFO ExcelReaderTest:25 - 第28行,数据:{"序号":"27","orderNo":"ZC16925846964571442","projectNo":"DY110400409587","本次打款总金额":"39.83元","结算单号":"GSD16925844343207431"}
18:16:48,815 INFO ExcelReaderTest:25 - 第29行,数据:{"序号":"28","orderNo":"ZC16925846510308639","projectNo":"DY110400409587","本次打款总金额":"39.83元","结算单号":"GSD16925844596560052"}
18:16:48,815 INFO ExcelReaderTest:25 - 第30行,数据:{"序号":"29","orderNo":"ZC16919940906941897","projectNo":"XDFW14144314434895","本次打款总金额":"10500.00元","结算单号":"GSD16787892369452546"}
18:16:48,815 INFO ExcelReaderTest:25 - 第31行,数据:{"序号":"30","orderNo":"ZC16905399739424309","projectNo":"DY17584958493645","本次打款总金额":"9.00元","结算单号":"GSD16905399441575256"}
18:16:48,816 INFO ExcelReaderTest:25 - 第32行,数据:{"序号":"31","orderNo":"ZC16905396284758057","projectNo":"DY10152215222400","本次打款总金额":"3.06元","结算单号":"GSD16738389 649603486"}
18:16:48,816 INFO ExcelReaderTest:25 - 第33行,数据:{"序号":"32","orderNo":"ZC16899050424420841","projectNo":"DY1406526528402","本次打款总金额":"1864.80元","结算单号":"GSD16786909746185396"}
18:16:48,816 INFO ExcelReaderTest:25 - 第34行,数据:{"序号":"33","orderNo":"ZC16892358221182248","projectNo":"DY1728032832239","本次打款总金额":"866.55元","结算单号":"GSD16892357362093868"}
18:16:48,816 INFO ExcelReaderTest:25 - 第35行,数据:{"序号":"34","orderNo":"ZC16892354367835727","projectNo":"KPZCJ14564156418064","本次打款总金额":"3999.98元","结算单号":"GSD16892353931173843"}
18:16:48,816 INFO ExcelReaderTest:25 - 第36行,数据:{"序号":"35","orderNo":"ZC16890449150466564","projectNo":"KPZCJ17354735471383","本次打款总金额":"29.91元","结算单号":"GSD16890448923257346"}
18:16:48,816 INFO ExcelReaderTest:25 - 第37行,数据:{"序号":"36","orderNo":"ZC16872536243521878","projectNo":"DY1058035839472","本次打款总金额":"2.00元","结算单号":"GSD16872535451495391"}
18:16:48,817 INFO ExcelReaderTest:25 - 第38行,数据:{"序号":"37","orderNo":"ZC16868187396317669","projectNo":"SZBF11313331330765","本次打款总金额":"1.02元","结算单号":"GSD16868183981406607"}
18:16:48,817 INFO ExcelReaderTest:25 - 第39行,数据:{"序号":"38","orderNo":"ZC16855920288559728","projectNo":"XDFW10492049206753","本次打款总金额":"3.00元","结算单号":"GSD16632261371210492"}
18:16:48,817 INFO ExcelReaderTest:25 - 第40行,数据:{"序号":"39","orderNo":"ZC16850945519224107","projectNo":"KPZCJ1006476478025","本次打款总金额":"4.00元","结算单号":"GSD16850943918013630"}
18:16:48,817 INFO ExcelReaderTest:25 - 第41行,数据:{"序号":"40","orderNo":"ZC16850834105212888","projectNo":"KPZCJ09285228529226","本次打款总金额":"30.00元","结算单号":"GSD16850832789336942"}
18:16:48,817 INFO ExcelReaderTest:25 - 第42行,数据:{"序号":"41","orderNo":"ZC16842058367487716","projectNo":"DY17591159110698","本次打款总金额":"75.60元","结算单号":"GSD16842057388913427"}
18:16:48,817 INFO ExcelReaderTest:25 - 第43行,数据:{"序号":"42","orderNo":"ZC16800783925056545","projectNo":"KPZCJ11104710473286","本次打款总金额":"20.00元","结算单号":"GSD16800783250594232"}
18:16:48,818 INFO ExcelReaderTest:25 - 第44行,数据:{"序号":"43","orderNo":"ZC16795435813626761","projectNo":"KPZCJ1406516514663","本次打款总金额":"10.00元","结算单号":"GSD16723051679897456"}
18:16:48,818 INFO ExcelReaderTest:25 - 第45行,数据:{"序号":"44","orderNo":"ZC16790400403067732","projectNo":"DY10102010200793","本次打款总金额":"1050.00元","结算单号":"GSD16790398836718985"}
18:16:48,819 INFO ExcelReaderTest:25 - 第46行,数据:{"序号":"45","orderNo":"ZC16788812382862096","projectNo":"KPZCJ16341034103659","本次打款总金额":"3500.00元","结算单号":"GSD16787998193851173"}
18:16:48,819 INFO ExcelReaderTest:25 - 第47行,数据:{"序号":"46","orderNo":"ZC16788812382862096","projectNo":"KPZCJ16341034103659","本次打款总金额":"3500.00元","结算单号":"GSD16788809089372484"}
18:16:48,819 INFO ExcelReaderTest:25 - 第48行,数据:{"序号":"47","orderNo":"ZC16788812382862096","projectNo":"KPZCJ16341034103659","本次打款总金额":"3500.00元","结算单号":"GSD16788809206582070"}
18:16:48,819 INFO ExcelReaderTest:25 - 第49行,数据:{"序号":"48","orderNo":"ZC16788743433892843","projectNo":"SZWJ1608298295724","本次打款总金额":"17.85元","结算单号":"GSD16788743263213068"}
18:16:48,819 INFO ExcelReaderTest:25 - 第50行,数据:{"序号":"49","orderNo":"ZC16788740588721943","projectNo":"KPZCJ16341034103659","本次打款总金额":"500.00元","结算单号":"GSD16787998193851173"}
18:16:48,819 INFO ExcelReaderTest:25 - 第51行,数据:{"序号":"50","orderNo":"ZC16788739134573304","projectNo":"KPZCJ16341034103659","本次打款总金额":"500.00元","结算单号":"GSD16788738549722418"}
18:16:48,820 INFO ExcelReaderTest:25 - 第52行,数据:{"序号":"51","orderNo":"ZC16788716782212770","projectNo":"DY1103153151761","本次打款总金额":"1.00元","结算单号":"GSD16788715186262758"}
18:16:48,820 INFO ExcelReaderTest:25 - 第53行,数据:{"序号":"52","orderNo":"ZC16788654801253827","projectNo":"KPZCJ16341034103659","本次打款总金额":"500.00元","结算单号":"GSD16787998193851173"}
18:16:48,820 INFO ExcelReaderTest:25 - 第54行,数据:{"序号":"53","orderNo":"ZC16787979223672877","projectNo":"XDFW18294329432132","本次打款总金额":"10000.00元","结算单号":"GSD16787978625297159"}
18:16:48,820 INFO ExcelReaderTest:25 - 第55行,数据:{"序号":"54","orderNo":"ZC16787886778675181","projectNo":"XDFW14144314434895","本次打款总金额":"10500.00元","结算单号":"GSD16787774522225825"}
18:16:48,820 INFO ExcelReaderTest:25 - 第56行,数据:{"序号":"55","orderNo":"ZC16787653644827069","projectNo":"SZWJ1504284280423","本次打款总金额":"500.00元","结算单号":"GSD16787653162134561"}
18:16:48,820 INFO ExcelReaderTest:25 - 第57行,数据:{"序号":"56","orderNo":"ZC16787612066579887","projectNo":"DY10282728275505","本次打款总金额":"1.00元","结算单号":"GSD16787611608613990"}
18:16:48,820 INFO ExcelReaderTest:25 - 第58行,数据:{"序号":"57","orderNo":"ZC16786771793559126","projectNo":"DY1537003703480","本次打款总金额":"330.22元","结算单号":"GSD16686513487010319"}
18:16:48,820 INFO ExcelReaderTest:25 - 第59行,数据:{"序号":"58","orderNo":"ZC16775798382046422","projectNo":"DY17221322139928","本次打款总金额":"1.03元","结算单号":"GSD16639253044471437"}
18:16:48,821 INFO ExcelReaderTest:25 - 第60行,数据:{"序号":"59","orderNo":"ZC16775798382040667","projectNo":"DY13435143514308","本次打款总金额":"8.24元","结算单号":"GSD16637505266694295"}
18:16:48,822 INFO ExcelReaderTest:25 - 第61行,数据:{"序号":"60","orderNo":"ZC16768736820910414","projectNo":"DY1734043445892","本次打款总金额":"12.00元","结算单号":"GSD16768736573639000"}
18:16:48,822 INFO ExcelReaderTest:25 - 第62行,数据:{"序号":"61","orderNo":"ZC16738489062053782","projectNo":"DY09541754174685","本次打款总金额":"4.22元","结算单号":"GSD16738487696523049"}
18:16:48,822 INFO ExcelReaderTest:25 - 第63行,数据:{"序号":"62","orderNo":"ZC16732451795398771","projectNo":"DY13575957594749","本次打款总金额":"2.04元","结算单号":"GSD16732450923115297"}
18:16:48,822 INFO ExcelReaderTest:25 - 第64行,数据:{"序号":"63","orderNo":"ZC16717828381432892","projectNo":"KPZCJ09531953193955","本次打款总金额":"100.99元","结算单号":"GSD16697992239288898"}
18:16:48,822 INFO ExcelReaderTest:29 - 所有数据已读取完毕!!!
18:16:48,822 INFO ExcelReaderTest:30 - 一共读取了63行数据
到此这篇关于Java基于EasyExcel实现读取Excel文件详解的文章就介绍到这了,更多相关Java EasyExcel读取Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
spring boot @PathVariable传递带反斜杠参数 / 的处理
这篇文章主要介绍了spring boot @PathVariable传递带反斜杠参数 / 的处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-02-02
Java C++题解leetcode902最大为N的数字组合数位DP
这篇文章主要为大家介绍了Java C++题解leetcode902最大为N的数字组合数位DP,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-10-10


最新评论