Java 中EasyExcel的使用方式

Java 中EasyExcel的使用方式

什么是EasyExcel

EasyExcel 是阿里巴巴开源的一个 Java 操作 Excel 的简单工具,具有自动识别 Excel 文件的类型(2003/2007/2010等)及生成 Excel 文件,读取数据和流式写入数据的功能。为我们处理 Excel 带来了很大的便利性。

EasyExcel 的使用方式

1. 添加依赖

在项目的 pom.xml 文件中,添加以下依赖:

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

2. 流式读取 Excel 文件

EasyExcel 支持流式读取 Excel 文件,这种方式适用于读取大批量数据时。

public class ExcelReaderDemo {
    /**
     * 读取普通的 sheet
     */
    public void readExcel(String fileName) throws IOException {
        // 直接传入文件流,通过回调函数读取excel中的每一行
        EasyExcel.read(fileName, new DemoDataListener()).sheet().doRead();
    }

    /**
     * 读取指定的 sheet
     */
    public void readSheet(String fileName, String sheetName) throws IOException {
        // 直接传入文件流,通过回调函数读取excel中的每一行,指定读取的sheet
        EasyExcel.read(fileName, new DemoDataListener()).sheet(sheetName).doRead();
    }

    /**
     * Excel 每一行的实体类,注意需要实现 EasyExcel 的接口
     */
    public static class DemoData {
        // Excel第一列数据
        private String firstCol;
        // Excel第二列数据
        private String secondCol;

        // setter 和 getter 方法省略略
        // ...
    }

    /**
     * 回调函数,通过 EasyExcel.read() 指定的示例
     */
    public static class DemoDataListener extends AnalysisEventListener<DemoData> {
        // 批处理阈值,每解析到这么多个数据就会回调一次 invoke 去处理
        private static final int BATCH_COUNT = 5;

        // 自定义的数据处理逻辑
        @Override
        public void invoke(DemoData data, AnalysisContext context) {
            // 接收到一条数据就处理一次
            System.out.println("接收到数据:" + data);
        }

        // 所有数据解析完成之后的回调
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 所有数据解析完成之后的回调
            System.out.println("所有数据解析完成");
        }
    }
}

3. 流式写入 Excel 文件

EasyExcel 支持流式写入 Excel 文件,这种方式适用于大批量写入数据时。

public class ExcelWriterDemo {
    /**
     * 写入 Excel 文件
     */
    public void writeExcel(String fileName) throws IOException {
        // 文件输出流,用来输出 Excel
        OutputStream out = new FileOutputStream(fileName);
        // ExcelWriter
        ExcelWriter excelWriter = EasyExcel.write(out).build();

        // sheet1
        writeSheet1(excelWriter);

        // sheet2
        writeSheet2(excelWriter);

        // 最后的操作
        excelWriter.finish();
    }

    /**
     * 写入 Sheet1
     */
    public void writeSheet1(ExcelWriter excelWriter) {
        // 设置sheet名字
        Sheet sheet = new Sheet(1, 0, DemoData.class);
        sheet.setSheetName("Sheet1");

        // 数据集合
        List<DemoData> data = getData();

        // 写入 Excel
        excelWriter.write(data, sheet);
    }

    /**
     * 写入 Sheet2
     */
    public void writeSheet2(ExcelWriter excelWriter) {
        // 设置sheet名字
        Sheet sheet = new Sheet(2, 0, DemoData.class);
        sheet.setSheetName("Sheet2");

        // 数据集合
        List<DemoData> data = getData();

        // 写入 Excel
        excelWriter.write(data, sheet);
    }

    /**
     * 获取数据
     */
    private List<DemoData> getData() {
        List<DemoData> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setFirstCol("第一列数据" + i);
            data.setSecondCol("第二列数据" + i);
            list.add(data);
        }
        return list;
    }

    /**
     * Excel 每一行的实体类,注意需要实现 EasyExcel 的接口
     */
    public static class DemoData {
        // Excel第一列数据
        private String firstCol;
        // Excel第二列数据
        private String secondCol;

        // setter 和 getter 方法省略略
        // ...
    }
}

EasyExcel 的常见问题

  1. 读取速度太慢,有没有更快的方法?
    答:默认读取是按行读取的,能读多少就要创建多少个对象,所以如果要读取大数据量时,需要用流式读取,这样就可以一行一行地读取,减少对象数量。
EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener()).sheet().doRead();
  1. 写入 Excel 文件时,如何设置字体?
    答:可以通过 HeadStyleHandlerContentStyleHandler 继承 AbstractCellStyleStrategy 然后覆盖 getHeadCellStylegetContentCellStyle 方法分别返回对应的 CellStyle 类型,例如:
public class ExcelCellStyleStrategy extends AbstractCellStyleStrategy {

    /**
     * 设置表头样式
     */
    @Override
    protected CellStyle getHeadCellStyle(Head head) {
        // 创建 CellStyle 对象
        CellStyle cellStyle = head.getHeadRowCellStyles().get(0);

        // 设置字体
        Font font = cellStyle.getFont();
        font.setFontName("宋体");//设置字体名称
        font.setFontHeightInPoints((short)12);//设置字号
        font.setBold(true);//是否加粗

        // 设置背景色
        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 边框
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        cellStyle.setBorderBottom(BorderStyle.THIN);

        return cellStyle;
    }

    /**
     * 设置内容样式
     */
    @Override
    protected CellStyle getContentCellStyle(Head head, List<List<String>> datas, Integer rowIndex,
                                             Integer cellIndex) {
        if (rowIndex % 2 == 0) {
            return getEvenCellStyle();
        } else {
            return super.getContentCellStyle(head, datas, rowIndex, cellIndex);
        }
    }

    // 设置偶数行的样式
    private CellStyle getEvenCellStyle() {
        CellStyle cellStyle = super.getBaseCellStyle();
        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        return cellStyle;
    }

}

示例

下面是一个复杂的流程,读取 A 文件夹下的多个 Excel 文件,并将它们的内容合并到一个新的 Excel 文件中:

public class ExcelMergeDemo {
    /**
     * 读取 A 文件夹下所有 Excel 文件,并合并到一个 Excel 文件中
     */
    public void merge(String path, String outFile) throws IOException {
        // 所有 DataFrame
        List<DataFrame> dataFrames = new ArrayList<>();

        // 加载所有 Excel 文件
        File file = new File(path);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (File f : files) {
                if (f.getName().endsWith(".xlsx")) {
                    DataFrame dataFrame = Excel.read(f.getAbsolutePath())
                            .sheet(0)
                            .headerAlias(getHeaderAlias())
                            .read();
                    dataFrames.add(dataFrame);
                }
            }
        }

        // 合并成一个 Excel 文件
        Excel.write(outFile)
                .sheet("Sheet1")
                .headerAlias(getHeaderAlias())
                .write(dataFrames)
                .finish();
    }

    /**
     * 返回表头映射
     */
    private Map<String, String> getHeaderAlias() {
        Map<String, String> headerAlias = new HashMap<>();
        headerAlias.put("编号", "id");
        headerAlias.put("姓名", "name");
        headerAlias.put("年龄", "age");
        return headerAlias;
    }
}

以上就是 EasyExcel 的使用方式和示例,我们可以通过 EasyExcel 实现丰富的 Excel 文件交互体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 中EasyExcel的使用方式 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java实现输出任意整数的每一位

    下面是java实现输出任意整数的每一位的完整攻略。 步骤一:将整数转成字符串 我们知道,字符串中每个字符都可以通过下标访问。所以,我们只需要将整数转换成字符串,就可以通过下标依次访问每个数字了。 int num = 123456; String numStr = String.valueOf(num); // 将整数转换成字符串 步骤二:遍历字符串,输出每一…

    Java 2023年5月26日
    00
  • 客户端设置超时时间真的很重要

    当你的应用程序在向远程服务发出请求时,可能会因该服务无法正常响应或者延迟过高而产生“阻塞”,直到远程服务响应或者过期后才会返回响应。客户端设置超时时间是一种防止这种“阻塞”的方式,可以让应用程序在一定时间内等待远程服务响应,如果超过了设定的超时时间,就会自动取消该请求并返回超时错误信息,防止程序长时间无响应的问题发生。 客户端设置超时时间的步骤如下: 确定需…

    Java 2023年5月23日
    00
  • 引入SpringCloud-gateway报错的解决方案

    接下来我将为你详细讲解“引入SpringCloud Gateway报错的解决方案”的完整攻略。 问题描述 在使用Spring Cloud Gateway框架进行开发时,可能会出现以下报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with nam…

    Java 2023年5月20日
    00
  • 分析SpringBoot的启动原理

    下面我会详细地讲解分析Spring Boot启动原理的攻略,内容如下。 什么是Spring Boot Spring Boot 是一个基于Spring Framework构建的用于快速构建Web应用程序和微服务的开源框架。 Spring Boot的主要目的是简化Spring的配置和开发过程。Spring Boot集成了Spring框架,内嵌了Tomcat、Je…

    Java 2023年5月15日
    00
  • java编程实现屏幕截图(截屏)代码总结

    Java编程实现屏幕截图(截屏)代码总结 在Java中,我们可以利用Robot类来进行屏幕截图(截屏),该类提供的createScreenCapture方法可以将屏幕上的指定区域截取并保存为图像文件。以下是实现屏幕截图的步骤总结: 导入Robot和AWT相关的包: java import java.awt.Rectangle; import java.awt…

    Java 2023年5月19日
    00
  • Java创建文件且写入内容的方法

    下面是”Java创建文件且写入内容的方法”的完整攻略: 前置知识 在学习Java创建文件且写入内容的方法之前,需要先了解Java中文件和流的概念。在Java中,操作文件需要使用File类,而读写文件需要使用输入输出流。 创建文件 Java中创建文件可以使用File类的createNewFile()方法: File file = new File("…

    Java 2023年5月20日
    00
  • Spring Security认证机制源码层探究

    Spring Security认证机制源码层探究 Spring Security是一个基于Spring框架的安全认证授权框架,它提供了一套完善的安全认证授权解决方案,提供了一系列的安全机制,例如用户名和密码认证、记住我、自动登录、动态权限控制、强制访问控制、会话管理等。 Spring Security认证机制基本原理 Spring Security的认证机制…

    Java 2023年5月20日
    00
  • 解决@PathVariable出现点号.时导致路径参数截断获取不全的问题

    在Spring MVC中,@PathVariable注解用于从URL中提取路径参数。但是,当路径参数中包含点号(.)时,Spring MVC会将其解释为文件扩展名,导致路径参数截断获取不全的问题。在本文中,我们将详细讲解如何解决这个问题,并提供两个示例来说明这个过程。 解决方案 要解决@PathVariable出现点号.时导致路径参数截断获取不全的问题,我们…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部