EasyExcel的替代项目FastExcel使用Demo详情

EasyExcel 项目作者停止维护了,推出新 FastExcel 仍是免费的开源框架,它具备以下特点:

  1. 完全兼容原 EasyExcel 的所有功能和特性,这使得用户可以无缝过渡。
  2. 从 EasyExcel 迁移到 FastExcel 只需简单地更换包名和 Maven 依赖即可完成升级。
  3. 在功能上,比 EasyExcel 提供更多创新和改进。
  4. FastExcel 新增了读取 Excel 指定行数和将 Excel 转换为 PDF 的功能。

FastExcel 具体使用如下

1.FastExcel 使用

1.1 添加依赖

<dependency>
 <groupId>cn.idev.excel</groupId>
 <artifactId>fastexcel</artifactId>
 <version>1.0.0</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter</artifactId>
</dependency>

Excel示例:

image

2.FastExcel 写入Demo

import cn.idev.excel.FastExcel;
import cn.idev.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* FastExcel 写入测试
*
* @author rick
* @since 2024/12/20
*/
@Slf4j
@AllArgsConstructor
public class WriteExcelDemo {
    // Excel写入功能
   @GetMapping("/download")
   public void download(HttpServletResponse response) throws IOException {
       response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
       response.setCharacterEncoding("utf-8");
       String fileName = URLEncoder.encode("test", "UTF-8");
       response.setHeader("Content-disposition",
               "attachment;filename*=utf-8''" + fileName + ".xlsx");
       // 写入数据
       FastExcel.write(response.getOutputStream(), CompanyDeptMember.class)
               .sheet("测试数据")
               .doWrite(buildData());
   }
    // 创建测试数据
   private List<CompanyDeptMember> buildData() {
       // 创建 CompanyDeptMember 测试数据
       List<CompanyDeptMember> dataList = new ArrayList<>();
       dataList.add(new CompanyDeptMember() {{
           setCompanyCode("C0001");
           setDepartmentCode("D0001");
           setMemberName("张三");
       }});
       dataList.add(new CompanyDeptMember() {{
           setCompanyCode("C0001");
           setDepartmentCode("D0001");
           setMemberName("李四");
       }});
       return dataList;
   }
    @Data
   public static class CompanyDeptMember {
       @ExcelProperty("公司编码")
       private String companyCode;
       @ExcelProperty("部门编码")
       private String departmentCode;
       @ExcelProperty("成员")
       private String memberName;
   }
}

3.FastExcel 读取Demo

import cn.idev.excel.FastExcel;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* FastExcel 读取测试
*
* @author rick
* @since 2024/12/20
*/
@Slf4j
@AllArgsConstructor
public class ReadExcelDemo {
    public static void main(String[] args) {
       String fileName = "D:/测试数据.xlsx";
       // 初始化Excel读取事件监听器
       BaseExcelListener<CompanyDeptMember> baseExcelListener = new BaseExcelListener<>();
       // 读取 Excel 文件
       FastExcel.read(fileName, CompanyDeptMember.class, baseExcelListener).sheet(0).doRead();
       // 得到读取数据
       List<CompanyDeptMember> dataList = baseExcelListener.getDataList();
       Map<String, Map<String, List<String>>> collect = dataList.stream().collect(Collectors.groupingBy(CompanyDeptMember::getCompanyCode, Collectors.groupingBy(CompanyDeptMember::getDepartmentCode, Collectors.collectingAndThen(Collectors.toList(), list -> list.stream().map(CompanyDeptMember::getMemberName).collect(Collectors.toList())))));
       // 处理格式
       List<Map<String, Object>> dealList = new ArrayList<>();
       collect.forEach((k, v) -> {
           v.forEach((k1, v1) -> {
               dealList.add(new HashMap<String, Object>() {{
                   put("companyCode", k);
                   put("departmentCode", k1);
                   put("mas", v);
               }});
           });
        });
       log.info("dealList:{}", JSON.toJSONString(dealList));
   }
     public static class BaseExcelListener<T> extends AnalysisEventListener<T> {
       // 用于存储读取到的Excel数据对象列表
       private List<T> dataList = new ArrayList<>();
        @Override
       public void invoke(T t, AnalysisContext analysisContext) {
           // 每读取一行数据,就将其添加到dataList中
           dataList.add(t);
       }
        @Override
       public void doAfterAllAnalysed(AnalysisContext analysisContext) {
           // 当所有数据读取完成后,可以在这里进行一些后续操作,如打印读取到的数据数量
           System.out.println("读取完成,共读取了 " + dataList.size() + " 条数据");
       }
        // 提供一个方法用于获取存储数据的列表
       public List<T> getDataList() {
           return dataList;
       }
   }
    @Data
   public static class CompanyDeptMember {
       @ExcelProperty("公司编码")
       private String companyCode;
       @ExcelProperty("部门编码")
       private String departmentCode;
       @ExcelProperty("成员")
       private String memberName;
   }
}

4.EasyExcel 如何升级到FastExcel

4.1 修改依赖

将 EasyExcel 的依赖替换为 FastExcel 的依赖,如下:

<!-- easyexcel 依赖 -->
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>easyexcel</artifactId>
 <version>xxxx</version>
</dependency>

依赖替换为:

<dependency>
 <groupId>cn.idev.excel</groupId>
 <artifactId>fastexcel</artifactId> <!-- 使用最新版本 -->
 <version>1.0.0</version>
</dependency>

4.2 修改代码

将 EasyExcel 的包名替换为 FastExcel 的包名,如下:

// 将 easyexcel 的包名替换为 FastExcel 的包名
import com.alibaba.excel.**;

替换为

import cn.idev.excel.**;

5.Excel转换为PDF

FastExcel 支持将 Excel 文件转换为 PDF 文件,FastExcel 将 Excel 转为Pdf 底层依赖于 Apache POI 和 itext-pdf。受限于 itext-pdf 的许可证,请确保您的使用符合 itext-pdf 的许可证,后续 FastExcel 将支持更多的 PDF 转换功能替换 itext-pdf,实现代码如下:

FastExcel.convertToPdf(new File("excelFile"),new File("pdfFile"),null,null);
posted @ 2024-12-20 15:46  Journey&Flower  阅读(60)  评论(0)    收藏  举报