• EasyExcel知识【Java程序进行读写生成Excel操作】


    目录

    1,Easy Excel入门

    1.1:Easy Excel概述

    1.2:Easy Excel特点

    1.3:环境搭建

    1.3.1:测试父项目

    1.3.2:测试excel项目

    1.4:基本操作

    1.4.1:测试JavaBean

    1.4.2:测试文件路径

    1.4.3:写入操作

    1.4.4:读出操作

    1.5:复杂操作

    1.5.1:复合表头

    1.5.2:写操作:多表

    1.5.3:读操作:多表

    1.5.4:写操作:多对象


    1,Easy Excel入门

    1.1:Easy Excel概述

     EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel工具。

    官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel

    github地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具

    1.2:Easy Excel特点

    Java解析、生成Excel比较有名的框架有Apache poi、jxl,但他们都存在一个严重的问题就是非常的耗内存。

    EasyExcel 重写了poi,使一个3M的excel只需要几M内存,并且再大的excel不会出现内存溢出

    64M内存1分钟内读取75M(46W行25列)的Excel。

    1.3:环境搭建

    1.3.1:测试父项目

    项目名:zx-test-parent

    • 修改pom文件

     

    
        
        
            org.springframework.boot
            spring-boot-starter-test
        
        
            org.springframework.boot
            spring-boot-starter-amqp
        
    
    

    1.3.2:测试excel项目

    项目名:zx-test-excel  

     

    修改pom,添加依赖

    
        
            com.alibaba
            easyexcel
            3.1.1
        
        
            org.projectlombok
            lombok
        
    

     

     

    1.4:基本操作

     

    1.4.1:测试JavaBean

    常用的注解:

     

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @ColumnWidth(30)
    5. @HeadRowHeight(30)
    6. public class Student1 {
    7. @ExcelProperty("编号")
    8. private String id;
    9. @ExcelProperty("姓名")
    10. @ContentFontStyle(fontName = "楷体",italic = BooleanEnum.TRUE,color = Font.ITALIC)
    11. private String name;
    12. @ExcelProperty({"基本信息","年龄"})
    13. private Integer age;
    14. @ExcelProperty({"基本信息","电话"})
    15. private String phone;
    16. @ExcelProperty({"可选信息","邮件"})
    17. private String Email;
    18. @ExcelProperty({"可选信息","生日"})
    19. @DateTimeFormat("yyyy-MM-dd HH:mm")
    20. private Date birthday;
    21. }

    1.4.2:测试文件路径

    1. public String path(){
    2. return this.getClass().getResource("/").getPath();
    3. }

    1.4.3:写入操作

    • excel 属于 office组件一个软件

    • 存在若干版本,大体上划分2种情况,2007前的,2007年后的

      • 2003版:扩展名 xls,内容比较少,最大单元格 IV65536 ,256列(IV)

      • 2007版:扩展名 xlsx,内容较多,最大单元格 XFD1048576,16384列(XFD)

    1. // 模拟数据
    2. public List getDate(){
    3. //模拟十条数据
    4. ArrayList student1s = new ArrayList<>();
    5. for (int i = 0; i < 10; i++) {
    6. Student1 student1 = new Student1(i+"","土豆"+i,i,"115"+i,"626"+i,new Date());
    7. student1s.add(student1);
    8. }
    9. return student1s;
    10. }
    11. //创建测试写程序
    12. @Test
    13. public void testWrite(){
    14. //写入位置:%classpath%/
    15. //文件名称:student-demo.xls
    16. //表名:土豆
    17. //1,文件位置
    18. String file = path()+"student_demo1.xls";
    19. //2 写操作
    20. EasyExcel.write(file, Student1.class).sheet("土豆").doWrite(getDate());
    21. }

    1.4.4:读出操作

    处理类:

    • 处理类需要实现 AnalysisEventListener 接口

    1. package com.czxy.read;
    2. import com.alibaba.excel.context.AnalysisContext;
    3. import com.alibaba.excel.event.AnalysisEventListener;
    4. import com.czxy.excel.Student1;
    5. public class StudentDataListener1 extends AnalysisEventListener {
    6. @Override
    7. public void invoke(Student1 student1, AnalysisContext analysisContext) {
    8. System.out.println(student1);
    9. }
    10. @Override
    11. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    12. }
    13. }
    1. //测试读出excel程序
    2. @Test
    3. public void testRead(){
    4. String file = path()+"student_demo1.xls";
    5. //读操作
    6. EasyExcel.read(file, Student1.class, new StudentDataListener1()).sheet("土豆").doRead();
    7. }

    1.5:复杂操作

    1.5.1:复合表头

    1. package com.czxy.excel;
    2. import com.alibaba.excel.annotation.ExcelProperty;
    3. import com.alibaba.excel.annotation.format.DateTimeFormat;
    4. import com.alibaba.excel.annotation.write.style.ColumnWidth;
    5. import com.alibaba.excel.annotation.write.style.ContentFontStyle;
    6. import com.alibaba.excel.annotation.write.style.HeadRowHeight;
    7. import com.alibaba.excel.enums.BooleanEnum;
    8. import lombok.AllArgsConstructor;
    9. import lombok.Data;
    10. import lombok.NoArgsConstructor;
    11. import java.awt.*;
    12. import java.util.Date;
    13. @Data
    14. @AllArgsConstructor
    15. @NoArgsConstructor
    16. @ColumnWidth(30)
    17. @HeadRowHeight(30)
    18. public class Student2 {
    19. @ExcelProperty("编号")
    20. private String id;
    21. @ExcelProperty("姓名")
    22. @ContentFontStyle(fontName = "楷体",italic = BooleanEnum.TRUE,color = Font.ITALIC)
    23. private String name;
    24. @ExcelProperty({"基本信息","年龄"})
    25. private Integer age;
    26. @ExcelProperty({"基本信息","电话"})
    27. private String phone;
    28. @ExcelProperty({"可选信息","邮件"})
    29. private String Email;
    30. @ExcelProperty({"可选信息","生日"})
    31. @DateTimeFormat("yyyy-MM-dd HH:mm")
    32. private Date birthday;
    33. }

    1.5.2:写操作:多表

    1. //得到根目录路径
    2. public String path(){
    3. return this.getClass().getResource("/").getPath();
    4. }
    5. // 模拟数据
    6. public List getDate(){
    7. //模拟十条数据
    8. ArrayList student1s = new ArrayList<>();
    9. for (int i = 0; i < 10; i++) {
    10. Student1 student1 = new Student1(i+"","土豆"+i,i,"115"+i,"626"+i,new Date());
    11. student1s.add(student1);
    12. }
    13. return student1s;
    14. }
    15. //创建测试书写多表
    16. @Test
    17. public void testWrite(){
    18. //写入位置:%classpath%/
    19. //文件名称:student-demo.xls
    20. //表名:土豆
    21. //1,文件位置
    22. String file = path()+"student_demo2.xls";
    23. //2 写操作
    24. ExcelWriter excelWriter = EasyExcel.write(file, Student2.class).build();
    25. //写入多个sheet
    26. WriteSheet writeSheet1 = EasyExcel.writerSheet("爱吃豆的").build();
    27. excelWriter.write(getDate(),writeSheet1);
    28. //写入第二个sheet
    29. WriteSheet writeSheet2 = EasyExcel.writerSheet("土豆").build();
    30. excelWriter.write(getDate(),writeSheet2);
    31. excelWriter.finish();
    32. }

    1.5.3:读操作:多表

    具有缓存处理类

    1. package com.czxy.read;
    2. import com.alibaba.excel.context.AnalysisContext;
    3. import com.alibaba.excel.event.AnalysisEventListener;
    4. import com.czxy.excel.Student2;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. public class StudentDataListener2 extends AnalysisEventListener {
    8. //创建一个集合用于保存学生
    9. private List student2List = new ArrayList<>();
    10. //创建一个变量用于判断
    11. private Integer size = 4;
    12. @Override
    13. public void invoke(Student2 student2, AnalysisContext analysisContext) {
    14. student2List.add(student2);
    15. if (student2List.size()>size){
    16. print();
    17. }
    18. }
    19. //重新创建一个方法
    20. public void print(){
    21. student2List.forEach(System.out::println);
    22. System.out.println("============");
    23. //打印完成之后进行清空集合
    24. student2List.clear();
    25. }
    26. //该方法
    27. @Override
    28. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    29. System.out.println("打印完成");
    30. //如果集合中还有数据进行打印
    31. if (!student2List.isEmpty()){
    32. print();
    33. }
    34. student2List.clear();
    35. }
    36. }

    读操作 

    1. @Test
    2. public void testRead(){
    3. String file = path()+"student_demo2.xls";
    4. //读操作
    5. ExcelReader excelReader = EasyExcel.read(file, Student2.class, new StudentDataListener2()).build();
    6. ReadSheet readSheet1 = EasyExcel.readSheet("爱吃豆的").build();
    7. excelReader.read(readSheet1);
    8. ReadSheet readSheet2 = EasyExcel.readSheet("土豆").build();
    9. excelReader.read(readSheet2);
    10. excelReader.finish();
    11. }

    1.5.4:写操作:多对象

    Student

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. public class Student {
    5. @ExcelProperty("姓名")
    6. private String name;
    7. @ExcelProperty("年龄")
    8. private Integer age;
    9. }

    Book

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. @HeadRowHeight(50)
    5. @HeadFontStyle(fontName = "黑体",italic = BooleanEnum.TRUE, color = Font.COLOR_RED, underline = 2)
    6. public class Book {
    7. @ExcelProperty("编号")
    8. private String id;
    9. @ExcelProperty({"作者信息","姓名"})
    10. private String authorName;
    11. @ExcelProperty({"作者信息","年龄"})
    12. private Integer authorAge;
    13. @ExcelProperty({"书籍基本信息","标题"})
    14. private String title;
    15. @ContentFontStyle(fontName = "楷书",italic = BooleanEnum.TRUE, color = Font.COLOR_RED, underline = -1)
    16. @ExcelProperty({"书籍基本信息","价格"})
    17. private Double price;
    18. @ExcelProperty({"书籍基本信息","出版日期"})
    19. @DateTimeFormat("yyyy年MM月dd日")
    20. private Date publishDate;
    21. }

     实现

    1. public class TestManyObject {
    2. // 获得当前项目的运行时的根目录
    3. public String getPath() {
    4. return this.getClass().getResource("/").getPath();
    5. }
    6. // 模拟数据
    7. public List getStudentData() {
    8. List list = new ArrayList<>();
    9. for (int i = 0; i < 20; i++) {
    10. list.add(new Student("张三" + i, 18 + i));
    11. }
    12. return list;
    13. }
    14. public List getBookData() {
    15. List list = new ArrayList<>();
    16. for (int i = 0; i < 20; i++) {
    17. list.add(new Book(i+"" , "张三" + i , 18 +i, "坏蛋是怎么"+i, 998d+i, new Date()));
    18. }
    19. return list;
    20. }
    21. // 遍历map即可
    22. private Map, List> getData() {
    23. Map, List> map = new HashMap<>();
    24. map.put(Student.class, getStudentData());
    25. map.put(Book.class, getBookData());
    26. return map;
    27. }
    28. @Test
    29. public void testManyObject() {
    30. String file = getPath() + "many_object.xlsx";
    31. //1 开始写
    32. ExcelWriter excelWriter = EasyExcel.write(file).build();
    33. //2 依次写每一个对象
    34. for(Map.Entry, List> entry : getData().entrySet()) {
    35. Class clazz = entry.getKey(); //类型
    36. List data = entry.getValue(); //数据
    37. WriteSheet writeSheet = EasyExcel.writerSheet(clazz.getSimpleName()).head(clazz).build();
    38. excelWriter.write(data, writeSheet);
    39. }
    40. //3 写完成
    41. excelWriter.finish();
    42. }
    43. }
  • 相关阅读:
    前端代码规范
    上门按摩小程序|同城上门按摩软件开发|上门按摩系统;
    Considering process from Apple Pay further steps
    28.开机默认启动系统-ubuntu和win10
    mirai登陆失败反复验证码或提示登录存在安全风险的解决方法
    分布式文件存储系统MinIO笔记
    pytest学习和使用12-Unittest和Pytest参数化详解
    长尾关键词优化 常见影响长尾关键词优化效果的3个因素
    2023年CCF-CSP考前冲刺
    windows环境下qt-material-widget开源库的编译
  • 原文地址:https://blog.csdn.net/m0_64550837/article/details/126655735