Bootstrap

FastExcel:高性能Excel处理框架

FastExcel:高性能Excel处理框架的全面解析

引言

FastExcel 是由原 EasyExcel 作者在阿里巴巴宣布停止维护 EasyExcel 后推出的升级版框架。

它不仅继承了 EasyExcel 的所有优点,还在性能和功能上进行了显著的提升和创新。

本文将深入探讨 FastExcel 的特点、使用方法及其与 EasyExcel 的区别,帮助开发者更好地理解和使用这一工具。

FastExcel 的核心特点

高性能读写

FastExcel 专注于性能优化,能够高效处理大规模的 Excel 数据,显著降低内存占用。

无论是读取还是写入,FastExcel 都表现出色,尤其适合处理数十万甚至上百万行的数据。

简单易用

FastExcel 提供了简洁直观的 API,使得开发者可以轻松集成到项目中。

无论是简单的 Excel 操作还是复杂的数据处理,FastExcel 都能快速上手。

流式操作

通过流式读取,FastExcel 将一次性加载大量数据的问题降到最低,特别适合处理大规模数据。

这种设计有效避免了内存溢出的风险。

完全兼容

FastExcel 完全兼容原 EasyExcel 的所有功能和特性,用户可以无缝过渡,无需担心兼容性问题。

持续更新

FastExcel 会持续更新,修复 bug,优化性能,并增加新功能,确保开发者始终能够使用到最新、最稳定的版本。

FastExcel 的使用方法

创建实体类和监听器

实体类定义

在使用 FastExcel 进行 Excel 文件的读写操作之前,需要定义一个实体类,该类中的每个属性对应 Excel 中的一列。

使用 @ExcelProperty 注解来指定列名。

import cn.idev.excel.annotation.ExcelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class Employee {
    @ExcelProperty("员工编号")
    private Integer employeeId;
    @ExcelProperty("员工姓名")
    private String employeeName;
    @ExcelProperty("员工年龄")
    private Integer employeeAge;
}

事件监听器

FastExcel 通过事件监听器实现 Excel 文件的逐行读取,这对于处理大文件尤为重要。

以下是一个事件监听器的示例:

import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;

public class EmployeeDataListener<T> extends AnalysisEventListener<T> {
private List<T> employeeRecords = new ArrayList<>();

    @Override
    public void invoke(T record, AnalysisContext context) {
        employeeRecords.add(record);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("数据读取完成,共读取了 " + employeeRecords.size() + " 条员工记录");
    }

    public List<T> getEmployeeRecords() {
        return employeeRecords;
    }
}

实现写入和读取功能

Excel 写入功能

以下是使用 FastExcel 进行 Excel 写入的示例代码。

首先,创建测试数据,然后通过 FastExcel.write 方法将数据写入到 Excel 文件中。


@GetMapping("/exportEmployees")
public void exportEmployees(HttpServletResponse httpResponse) throws IOException {
    httpResponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    httpResponse.setCharacterEncoding("utf-8");
    String outputFileName = URLEncoder.encode("员工数据", "UTF-8");
    httpResponse.setHeader("Content-disposition", "attachment;filename*=utf-8''" + outputFileName + ".xlsx");
    // 写入数据
    FastExcel.write(httpResponse.getOutputStream(), Employee.class)
        .sheet("员工信息")
        .doWrite(generateEmployeeData());
}

// 生成测试数据
private List<Employee> generateEmployeeData() {
    Employee employee1 = new Employee();
    employee1.setEmployeeId(101);
    employee1.setEmployeeName("王五");
    employee1.setEmployeeAge(28);
    Employee employee2 = new Employee();
    employee2.setEmployeeId(102);
    employee2.setEmployeeName("赵六");
    employee2.setEmployeeAge(32);
    return List.of(employee1, employee2);
}

Excel 读取功能

以下是使用 FastExcel 进行 Excel 读取的示例代码。

通过 FastExcel.read 方法读取 Excel 文件,并使用之前创建的监听器来处理读取到的数据。


@PostMapping("/importEmployees")
public ResponseEntity<String> importEmployees(@RequestParam("employeeFile") MultipartFile employeeFile) {
    if (employeeFile.isEmpty()) {
        return ResponseEntity.badRequest().body("请上传一个有效的文件!");
    }
    try {
        EmployeeDataListener<Employee> employeeListener = new EmployeeDataListener<>();
        FastExcel.read(employeeFile.getInputStream(), Employee.class, employeeListener).sheet().doRead();
        List<Employee> employeeRecords = employeeListener.getEmployeeRecords();
        System.out.println(employeeRecords);
        return ResponseEntity.ok("员工数据文件上传并处理成功!");
    } catch (IOException e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件处理失败!");
    }
}

Excel 转换为 PDF

FastExcel 还支持将 Excel 文件转换为 PDF 文件,这一功能底层依赖于 Apache POIitext-pdf

需要注意的是,使用 itext-pdf 时需要确保符合其许可证要求。


FastExcel.convertToPdf(new File("员工数据.xlsx"), new File("员工数据.pdf"), null, null);

FastExcel 与 EasyExcel 的区别

性能提升

FastExcel 在性能上比 EasyExcel 更好,更稳定,尤其是在处理大规模数据时表现尤为突出。

API 一致性

FastExcelEasyExcel 的 API 完全一致,用户可以无缝切换,无需重新学习。

功能增加

FastExcel 1.0.0 版本新增了读取 Excel 指定行数和将 Excel 转换为 PDF 的功能,进一步扩展了其应用场景。

总结

FastExcel 作为一个轻量级但功能强大的 Java 库,专为需要高性能和低内存占用的 Excel 文件处理而设计。

其流式处理和灵活的 API 使其成为处理 Excel 文件的理想工具。

无论是企业数据导入导出还是个人项目开发,FastExcel 都能提供强大的支持。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;