功能:解析Excel是个很常见的需求,笔者文件是通过注解形式结合poi来解析Excel文件。
如将下面的Excel映射成Student类。
第一步:引入相关依赖
org.apache.poi
poi
3.17
org.apache.poi
poi-ooxml
3.17
org.apache.poi
poi-ooxml-schemas
3.17
第二步:创建相关注解:
第一个为主注解,用于规定映射对象中字段和标题的对应关系。
package com.psp.poidemo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Map;
/**
* @author psp
* @description 用于标识对应字符对应文件上的属性
* @date 2020/3/26
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FileAttributes {
String value();
String defualtValue() default "";
boolean isNull() default true;
boolean hasMap() default false;
FileProperty[] propertyList() default {};
Class type() default String.class;
}
第二个注解用于解析单元格中内容的一些特定映射关系,比如单元格中假设存在性别字段,男映射成对象中的M,女映射成对象中的F,此时需要用到这个注解。
package com.psp.poidemo;
import java.lang.annotation.*;
/**
* @author psp
* @description 内容映射关系
* @date 2020/3/26
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FileProperty {
String key();
String value();
}
第三步:创建映射对象类:
package com.psp.poidemo;
import lombok.Data;
/**
* @author psp
* @description 学生测试类
* @date 2020/3/26
*/
@Data
public class Student {
private String id;
@FileAttributes(value = "学号",isNull = false)
private String studentNo;
@FileAttributes(value = "姓名",isNull = false)
private String studentName;
@FileAttributes(value = "性别",hasMap = true,defualtValue = "M",propertyList = {
@FileProperty(key = "男",value = "M"),
@FileProperty(key = "女",value = "F")
})
private String sex;
}
第四步:逻辑代码的编写
package com.psp.poidemo;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author psp
* @description 解析文件工具类
* @date 2020/3/26
*/
public class ParsingFileUtils {
//文件后缀
private static final String FILE_CONTENT_TYPE_XLSX="xlsx";
private static final String FILE_CONTENT_TYPE_XLS="xls";
private static Logger logger= LoggerFactory.getLogger(ParsingFileUtils.class);
/**
* 将Excel文件转换成list集合
* @param in 文件输入流
* @param suffix 文件后缀
* @param clazz 文件转换对象类型
* @return list集合
* @throws IOException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static List