Java使用easyExcel操作Excel案例

本文介绍了如何使用阿里巴巴的easyExcel库进行Excel操作,包括读取和写入等常见场景,提供了一个完整的测试类和实体类案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  这两天一直在玩些小工具,今天整了下阿里巴巴的easyExcel,下面是案例:

import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.read.context.AnalysisContext;
import com.alibaba.excel.read.event.AnalysisEventListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.junit.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class TestExcel {

  @Test
    public void testRead() throws FileNotFoundException {
    InputStream inputStream =getInputStream("C:\\Users\\LiGe\\Desktop\\test.xls");
    try {
      ExcelReader reader = new ExcelReader(inputStream, ExcelTypeEnum.XLS, null, new AnalysisEventListener() {
        @Override
        public void invoke(Object o, AnalysisContext analysisContext) {
          System.out.println("当前sheet"+analysisContext.getCurrentSheet().getSheetNo()+ " 当前行:" + analysisContext.getCurrentRowNum()
                  + " data:" + o);
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {

        }
      });
      reader.read();
    }catch (Exception e){
  e.printStackTrace();
    }finally {
      try {
        inputStream.close();
      }catch (IOException e){
        e.printStackTrace();
      }
    }
  }

  @Test
  public void testWriter() throws FileNotFoundException {
    OutputStream out = new FileOutputStream("C:\\Users\\LiGe\\Desktop\\test.xls");
    try {
      ExcelWriter writer = new ExcelWriter(out,ExcelTypeEnum.XLS);
      //写第一个sheet
      Sheet sheet = new Sheet(2,3,ImportInfo.class);
      writer.write(getDate(),sheet);
      for (ImportInfo in: getDate()
           ) {
        System.out.println(in.getName());
      }
      writer.finish();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        out.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  public List<ImportInfo> getDate(){
    List<ImportInfo> list = new ArrayList<ImportInfo>();
    ImportInfo info = new ImportInfo();
    info.setAge(12);
    info.setName("zhangsan");
    info.setEmail("11111@qq.com");
    ImportInfo info1 = new ImportInfo();
    info1.setAge(12);
    info1.setName("zhangsan1");
    info1.setEmail("11111@qq.com");
    ImportInfo info2 = new ImportInfo();
    info2.setAge(12);
    info2.setName("zhangsan2");
    info2.setEmail("11111@qq.com");
    list.add(info);list.add(info1);list.add(info2);
    return list;
  }



  private InputStream getInputStream(String fileName) {
    try {
      return new FileInputStream(new File(fileName));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
      return null;
  }
}

上面是测试类,这是实体类:

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;

public class ImportInfo extends BaseRowModel {
    @ExcelProperty(index = 0)
    private String name;
    @ExcelProperty(index = 1)
    private Integer age;
    @ExcelProperty(index = 2)
    private String email;
    /*
    通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列
    作为Excel的模型对象,需要setter方法
     */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
<think>我们正在讨论EasyExcel库的写入操作。根据引用内容,我们可以找到两个写入示例(引用[2])和一个关于注解的引用(引用[3])。用户要求的是写入Excel的示例代码或实战案例。引用[2]提供了两个写入示例:1.第一种写法:直接使用EasyExcel.write方法链式调用,指定文件路径、数据模型类(Student.class)、工作表名称,然后调用doWrite方法并传入数据集合。2.第二种写法:使用ExcelWriter对象,通过构建器模式构建,然后写入多个工作表。同时,引用[3]提到了@ExcelProperty注解,该注解用于映射Java对象属性和Excel表格的列。因此,我们可以给用户提供一个简单的写入示例,包括以下步骤:1.引入依赖(如引用[3]所示,但注意版本可能更新,用户需根据实际情况选择)2.创建一个数据模型类(例如Student),使用@ExcelProperty注解指定列顺序和表头名称。3.编写数据生成方法(模拟数据)4.编写写入Excel的代码,采用上述两种写法之一(或两种都展示)由于用户要求的是示例代码,我们将重点放在代码上,并给出必要的解释。注意:引用[1]虽然提到了合并单元格,但用户当前问题没有要求合并单元格,所以我们可以先提供基础写入示例。如果用户后续需要合并单元格,再根据引用[1]提供的方法补充。下面按照用户要求,使用中文回答,并注意格式要求(包括数学表达式的格式,但本问题不涉及数学表达式,故忽略)。</think>### EasyExcel 写入 Excel 示例代码 以下是使用 EasyExcel 写入 Excel 文件的完整实战案例,包含两种常用写法: #### 1. 基础准备 **依赖配置** (pom.xml): ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.3</version> </dependency> ``` **实体类定义** (使用 `@ExcelProperty` 注解): ```java public class Student { @ExcelProperty("学号") // 表头名称 private String id; @ExcelProperty("姓名") private String name; @ExcelProperty(value = "成绩", index = 2) // index指定列顺序 private Integer score; // 必须有无参构造函数 // 省略getter/setter } ``` #### 2. 写入示例代码 **写法一:单工作表写入** (推荐简单场景) ```java public class EasyExcelWriteDemo { public static void main(String[] args) { String filePath = "C:/data/students.xlsx"; // 1. 准备数据 List<Student> data = Arrays.asList( new Student("S001", "张三", 85), new Student("S002", "李四", 92) ); // 2. 写入文件(自动关闭资源) EasyExcel.write(filePath, Student.class) .sheet("学生成绩单") // 工作表名称 .doWrite(data); // 写入数据集合 } } ``` **写法二:多工作表写入** (适合复杂场景) ```java public class MultiSheetWrite { public static void main(String[] args) { String filePath = "C:/data/multi_sheet.xlsx"; try (ExcelWriter excelWriter = EasyExcel.write(filePath).build()) { // 工作表1:学生数据 WriteSheet sheet1 = EasyExcel.writerSheet(0, "学生表") .head(Student.class) // 指定表头模型 .build(); excelWriter.write(generateStudents(), sheet1); // 工作表2:课程数据 WriteSheet sheet2 = EasyExcel.writerSheet(1, "课程表") .head(Course.class) // 另一个模型类 .build(); excelWriter.write(generateCourses(), sheet2); } // 自动关闭ExcelWriter } } ``` #### 3. 关键特性说明 1. **自动表头生成**:根据实体类的 `@ExcelProperty` 注解自动生成表头 2. **大文件优化**:通过分片读写机制避免 OOM(3M Excel 仅需几 MB 内存)[^1] 3. **数据类型支持**:自动处理日期、数字格式(通过 `@DateTimeFormat` 等注解) 4. **样式自定义**:可通过 `@ContentStyle` 注解设置字体/背景色等样式 #### 4. 合并单元格示例 ```java // 注册自定义单元格合并策略 WriteCellStyle headStyle = new WriteCellStyle(); headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); WriteSheet sheet = EasyExcel.writerSheet() .registerWriteHandler(new CellMergeStrategy(0, 1)) // 合并A、B列相同行 .head(Student.class) .build(); ``` > **注意**:实际文件路径需替换为有效路径,数据集合需实现 `Collection` 接口 [^1]: EasyExcel 通过创新的内存管理算法,显著降低大文件处理时的内存占用,相比 POI 可减少 90% 以上内存消耗 [^2]: 两种写入方式分别适用于简单场景和需要精细控制的多工作表场景 [^3]: `@ExcelProperty` 注解支持 index 属性控制列顺序,converter 属性实现自定义数据类型转换
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值