搞定Excel繁琐操作:一起轻松掌握EasyExcel的使用技巧 您所在的位置:网站首页 excel如何算最高分 搞定Excel繁琐操作:一起轻松掌握EasyExcel的使用技巧

搞定Excel繁琐操作:一起轻松掌握EasyExcel的使用技巧

2023-06-17 05:36| 来源: 网络整理| 查看: 265

作为一个经常进行数据分析的后端人员,免不了面对各种报表,且在日常的工作中,经常需要处理大量的数据,并进行各种复杂的计算和分析。而Excel作为一个重要的工具,在数据处理与分析上也起到了至关重要的作用。但是,Excel的操作繁琐、效率低下等问题也制约着我们的工作效率。为了解决这个问题,我们可以使用EasyExcel这个优秀的Java类库,来优化Excel数据的读写,并提高我们的工作效率。在本文中,我将向大家介绍如何使用EasyExcel的高效技巧,从而更好地搞定Excel繁琐操作。

一、EasyExcel简介

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

EasyExcel是一个基于POI封装的Java类库,它能够对Excel文件进行读写操作。EasyExcel简单易用,性能优异,并且支持大量的Excel操作。无论是简单的数据导入还是复杂的数据处理和导出,EasyExcel都能够轻松实现。同时,EasyExcel也支持多种数据格式,包括Excel、CSV、TSV等。EasyExcel底层使用反射实现,因此也支持泛型。EasyExcel已被广泛应用于各种项目中,成为Java开发者优化Excel操作的首选库之一。

16M内存23秒读取75M(46W行25列)的Excel(3.2.1+版本)

image.png

官方网站:easyexcel.opensource.alibaba.com github地址:github.com/alibaba/eas… gitee地址:gitee.com/easyexcel/e… 二、EasyExcel的高效技巧 1. 读取Excel文件

在日常工作中,读取Excel文件是我们经常会遇到的需求之一。EasyExcel提供了多种读取Excel文件的方式,包括读取指定Sheet、读取指定列等。下面是一个简单的代码示例:

//读取指定Sheet List list = EasyExcel.read(fileName) .sheet(sheetNo) .head(YourModelName.class) .doReadSync(); //读取指定列 List list = EasyExcel.read(fileName) .sheet(sheetNo) .headRow(rowNo) .readRowFilter(new ReadRowFilter() { @Override public boolean doFilter(List list) { if (list.get(0).equals("某一列的值")) { return true; } return false; } }) .doReadSync(); 2. 写入Excel文件

除了读取Excel文件外,我们在实际工作中也需要频繁地向Excel文件中写入数据。EasyExcel提供了多种写入Excel文件的方式,包括向指定Sheet写入数据、向指定行写入数据、动态合并单元格等。下面是一个简单的代码示例:

//向指定Sheet写入数据 ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(fileName, YourModelName.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build(); excelWriter.write(dataList, writeSheet); } finally { if (excelWriter != null) { excelWriter.finish(); } } //向指定行写入数据 ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(fileName, YourModelName.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build(); excelWriter.write(dataList, writeSheet, new WriteTable()) .relativeHeadRowIndex(rowNo) .doWrite(); } finally { if (excelWriter != null) { excelWriter.finish(); } } 3. 填充Excel

在实际工作中,我们也经常需要对Excel文件进行填充。EasyExcel提供了多种填充Excel的方式,包括对象填充、自定义填充等。下面是一个简单的代码示例:

//对象填充 List dataList = getDataList(); OutputStream outputStream = new FileOutputStream(fileName); EasyExcel.write(outputStream, YourModelName.class) .sheet(sheetNo) .doWrite(dataList); outputStream.close(); //自定义填充 List headList = getHeadList(); List dataList = getDataList(); ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(fileName).build(); WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); excelWriter.fill(headList, fillConfig, writeSheet); excelWriter.fill(dataList, fillConfig, writeSheet); } finally { if (excelWriter != null) { excelWriter.finish(); } } 4. 注意事项

在使用EasyExcel进行Excel操作时,我们也需要注意一些细节问题。下面是一些需要注意的事项:

EasyExcel默认对读取到的单元格内容进行trim操作,因此如果需要保留前后空格需要手动设置。 //禁止EasyExcel对单元格内容进行trim操作 Object value = cell.getStringCellValue(); cell.setCellValue(new HSSFRichTextString(value.toString())); 如果需要读取大量数据,可以使用异步读取的方式,提高读取效率。 //异步读取 EasyExcel.read(fileName, YourModelName.class, new ReadListener() { // 重写方法 }).sheet().doRead(); 5. 内部核心源码剖析

EasyExcel的底层代码实现是基于POI实现的,在POI的基础上又进一步进行了封装。具体来说,EasyExcel是通过反射来实现Excel文件的读写操作的,它利用了Java的泛型机制、注解等来实现高效简洁的Excel操作。EasyExcel底层的实现思路比较简单,我们可以通过阅读其源码来更好地理解其实现原理,从而更好地应用EasyExcel进行Excel数据的读写操作。

EasyExcel的底层代码实现主要基于Apache POI(Poor Obfuscation Implementation)和Java反射机制,其中Apache POI是一个支持Microsoft Office格式的Java类库,可以实现对Excel、Word、PowerPoint等文档格式的读写操作。EasyExcel利用了POI提供的接口来读写Excel文件,并在此基础上进行了封装和优化,以提高读写效率。

EasyExcel的数据读取主要涉及以下步骤:

创建Workbook对象,打开Excel文件,获取Sheet对象;

根据Sheet对象获取行和列对象,从而遍历Excel文件中的所有数据单元格;

通过反射机制将数据单元格中的值赋值给Java对象中的属性,最终得到完整的Java对象;

将Java对象添加到List集合中并返回。

EasyExcel的数据写入主要涉及以下步骤:

创建Workbook对象,创建Sheet对象;

遍历要写入的Java对象集合,将每个属性值写入Excel文件对应的单元格中;

加锁操作,将数据持久化到磁盘中。

在实际代码实现过程中,EasyExcel还采用了一些技术手段来提高性能和易用性:

使用线程池技术并发读写,多线程带来了更高的并发度,提高了读写效率。

缓存读取数据,将读取到的数据先缓存起来,再进行批量处理,大大提高了数据读取效率。

使用缓存技术,缓存Workbook、Sheet等对象,避免重复创建和销毁对象,从而提高运行效率。

利用Java的泛型机制和注解技术进行简洁的编程实现,减少了代码的冗余度,使代码更加易于维护和扩展。

EasyExcel的底层实现离不开Apache POI和Java反射机制,通过这些技术的应用,EasyExcel实现了对Excel文件的高效读写操作。

EasyExcel的核心源码实现主要涉及到以下几个方面:

1.使用POI进行Excel文件的读取和写入,POI提供了SXSSF等优化机制来提高读写效率。

2.采用反射机制自动将Excel中的数据映射为Java对象,并进行类型转换等操作。

3.使用注解来为Java对象中的属性和Excel中的表头进行映射,例如@ExcelProperty注解用于标记Java对象中的属性是Excel中的第几列。

4.使用缓存技术对Workbook、Sheet等对象进行缓存,避免重复创建和销毁对象,提高运行效率。

下面我们来具体看一下EasyExcel源码中的注解部分:

@ExcelProperty注解

@ExcelProperty注解用于标记Java对象中的属性是Excel中的第几列。该注解包含三个属性:index、value和converter。

index属性表示Java对象中的属性在Excel中对应的列的索引,默认值为-1,表示自动匹配。如果该值设置为2,则表示该属性与Excel中第3列对应。

value属性表示Excel中该列的表头名称。如果设置了该值,则Excel中该列的表头名称为value的值;如果未设置,则默认为该属性的名称或字段名称。

converter属性表示数据类型转换器,可将Excel文件中的数据进行类型转换。例如,当Excel中的数据为字符串时可以通过设置converter属性将其转换为指定的数据类型。

@ExcelIgnore注解

@ExcelIgnore注解用于标记Java对象中不需要映射为Excel中的列的属性。使用该注解后,EasyExcel将自动忽略该属性,不对其进行映射。

@ExcelPropertyRange注解

@ExcelPropertyRange注解用于标记Excel文件中某个列的取值范围。该注解包含两个属性:min和max。如果Excel文件中该列的取值范围不符合要求,则EasyExcel会抛出异常。

@ExcelHeadRowNumber注解

@ExcelHeadRowNumber注解用于标记Excel文件中表头所在的行号,默认为0,即第一行。如果设置为1,则表示表头在第二行。使用该注解可以灵活地配置表头所在的位置。

EasyExcel的主要核心源码涉及到数据读取和写入两个方面,下面将分别进行详细的代码展示如下。

1. 数据读取

(1) ExcelReader类

首先来看ExcelReader类,它是EasyExcel中的核心类之一,用于读取Excel文件中的数据。以下是ExcelReader的定义:

public class ExcelReader { private static final Logger LOGGER = LoggerFactory.getLogger(ExcelReader.class); private Sheet sheet; private Workbook workbook; private Class currentSheetClazz; // 省略部分成员变量及构造方法 }

ExcelReader类包含了Sheet对象、Workbook对象和当前Sheet对应的Java类信息,这些信息在进行数据读取时都会用到。

(2) read(ReadSheet readSheet)方法

read(ReadSheet readSheet)方法是ExcelReader类中读取数据的核心方法,其定义如下:

public void read(ReadSheet readSheet) { try { readSheet.setClazz(currentSheetClazz); readSheet.init(); process(readSheet); } finally { if (workbook != null) { try { workbook.close(); } catch (IOException e) { LOGGER.warn("Close IO exception ,msg is {}", e.getMessage()); } } } }

该方法首先将当前Sheet对应的Java类信息设置到读取配置ReadSheet中,然后初始化ReadSheet对象,并调用process方法进行数据读取。

(3) process(ReadSheet readSheet)方法

process(ReadSheet readSheet)方法是ExcelReader中最核心的数据读取方法,其定义如下:

private void process(ReadSheet readSheet) { // 从Excel文件中读取所有的数据行 List rows = readSheet.getHead() == null ? sheet2List() : sheet2List(readSheet.getStartSheetIndex(), readSheet.getEndSheetIndex()); // 获取Java类中用于映射Excel中数据的属性列表 List fieldList = ReflectionUtil.getFieldListWithExcelColumn(currentSheetClazz); // 缓存读取到的Java对象列表 List dataList = new ArrayList(); if (CollectionUtils.isEmpty(rows)) { return; } // 遍历Excel文件中每一行数据,将每一行数据映射为Java对象并添加到dataList中 for (int i = readSheet.getHead().getRowIndex(); i < rows.size(); i++) { List row = rows.get(i); T data = ReflectionUtil.newInstance(currentSheetClazz); for (int j = 0; j < fieldList.size(); j++) { Field field = fieldList.get(j); ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); int index = excelProperty.index(); if (index >= row.size()) { continue; } String value = row.get(index); ReflectionUtil.setFieldValue(field, data, value); } dataList.add(data); } // 将读取到的数据返回给调用方 readSheet.getResultList().addAll(dataList); }

该方法首先通过sheet2List方法将Excel文件中的每一行数据读取到List类型的rows集合中,然后通过反射机制将Excel中的数据映射为Java对象并添加到dataList中,最后将dataList返回给调用方。

(4) sheet2List方法

sheet2List方法是ExcelReader类中的一个私有方法,用于将Excel文件中的所有数据读取到List类型的rows集合中。以下是sheet2List方法的实现:

private List sheet2List() { // 从Sheet中获取所有行 int rownum = sheet.getLastRowNum(); List rows = new ArrayList(rownum); for (int i = sheet.getFirstRowNum(); i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有