欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EasyExcel 的使用

程序员文章站 2022-04-01 18:53:10
一、使用EasyExcel 读取excel数据并转换成对象1、使用的maven依赖及版本: com.alibaba easyexcel 2.1.4

一、使用EasyExcel 读取excel数据并转换成对象

1、使用的maven依赖及版本:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>easyexcel</artifactId>
   <version>2.1.4</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.17</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.17</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-scratchpad</artifactId>
   <version>3.17</version>
</dependency>

2、代码如下:将用到三个类,MyExcelListener.java,StudentInfo.java,ExcelUtil.java

StudentInfo.java

@Getter
@Setter 
public class StudentInfo implements Serializable {
  private static final long serialVersionUID = 7566235228027597205L;

  private String studnetName;

  private String gender;

  private String classes;

  private double score;
}

   ExcelListener.java

ExcelListener.java

  public static class ExcelListener extends AnalysisEventListener<Object> {

    private int headSize;     //头部大小,一般是指对象的总属性

    private List<Object> datas = new ArrayList<>();   // excel文档的内容存储
    /**
     * 逐行解析
     * object : 当前行的数据
     */
    @Override
    public void invoke(Object object, AnalysisContext context) {
      if (object != null) {
        datas.add(object);
      }
    }

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
      super.invokeHeadMap(headMap, context);
      headSize = headMap.size();
    }

    public int getHeadSize() {
      return headSize;
    }

    public void setHeadSize(int headSize) {
      this.headSize = headSize;
    }

    /**
     * 解析完所有数据后会调用该方法
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
      //销毁不用的资源
    }

    public List<Object> getDatas() {
      return datas;
    }

    public void setDatas(List<Object> datas) {
      this.datas = datas;
    }
  }

3、ExcelUtil.java 包含两个主要方法 [1]读取excel的数据、[2]解析成对象

package com.violetg.conform.office.easyexcel;

import com.alibaba.excel.EasyExcelFactory;

import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.io.*;
import java.lang.reflect.Field;
import java.util.*;


public class ExcelUtil {

  private static ReadSheet initReadSheet;

  private static WriteSheet initWriteSheet;

  static {
    initReadSheet = new ReadSheet(1,"sheet");
    initWriteSheet = new WriteSheet();
    initWriteSheet.setSheetName("sheet");
    initWriteSheet.setSheetNo(1);
  }
 
  /*
   * 1、 读取excel
   * @param filePath
   * @param sheet
   * @return
   */

  public static List<Object> readRow(String filePath, ReadSheet sheet){
     if(!StringUtils.hasText(filePath)){
       return null;
     }
    sheet =  sheet != null ?sheet :initReadSheet;
    InputStream fileStream = null;
    ExcelListener excelListener = new ExcelListener();
    ExcelReader excelReader = null;
    try{
      fileStream = new FileInputStream(filePath);
      excelReader = EasyExcelFactory.read(fileStream, excelListener).autoTrim(true).doReadAll();
      return excelListener.getDatas();
    }catch (FileNotFoundException e) {
      e.printStackTrace();
    }finally {
      try{
        if(fileStream != null){
          fileStream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return null;
  }

/**
   * 2、转换成对象
   * @param classPath  映射模型的类的全路径
   * @param objectList excel内容
   * @return
   */
  private static JSONArray dataReflet(String classPath, List<Object> objectList) {
    JSONArray jsonArr = new JSONArray();
    try {
      Class<?> clazz = Class.forName(classPath);
      Field[] importField = clazz.getDeclaredFields();
      for (Object obj : objectList) {
        Map<Integer,String>  map = (LinkedHashMap)obj;
        String[] values = map.values().toArray(new String[0]);
        JSONObject jsonObj = new JSONObject();
        for (int i = 0; i <= values.length; i++) {
          Field field = importField[i];
          // 字段为 serialVersionUID时不读取
          if ("serialVersionUID".equals(field.getName())) {
            continue;
          }else{
            jsonObj.put(field.getName(),values[i-1]);
          }
        }
        jsonArr.add(jsonObj);
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
    return jsonArr;
  }

 /**
   * 3) 测试
   * 
   */
  public static void main(String[] args) {
    // 数据导入
    String filePath = "D:\\software\\study\\data\\ExcelImport.xlsx";
    readRow(filePath,null);
    List<Object> objectList = ExcelUtil.readRow(filePath, null);
    String classPath = "com.violetg.conform.office.easyexcel.StudentInfo";
    JSONArray jsonArr = dataReflet(classPath, objectList);
    List<StudentInfo> dtoList = new ArrayList<>();
    dtoList = JSONArray.parseArray(jsonArr.toJSONString(), StudentInfo.class);
    System.out.println(dtoList.toString());
  }





测试结果如下所示:

[{"classes":"1","gender":"男","score":0.0,"studnetName":"张三"}, {"classes":"2","score":89.12,"studnetName":"李四"}, {"classes":"1","gender":"男","score":96.14,"studnetName":"王麻子"}, {"classes":"1","gender":"女","score":94.15,"studnetName":"孙小"}]

 

本文地址:https://blog.csdn.net/seragxx/article/details/107683851