(拿去CV就能用!)EasyExcel读写Excel详细流程(图解+代码)

导入EasyExcel依赖


    com.alibaba
    easyexcel
    2.2.6

读操作

public class Test {
    public static void main(String[] args) {
        //读取文件
        //创建ExcelReaderBuilder实例
        ExcelReaderBuilder readerBuilder = EasyExcel.read();
        //获取文件对象
        readerBuilder.file("D:\\java\\用户数据表.xls");
        //指定sheet
        readerBuilder.sheet("用户数据表");
        //自动关闭输入流
        readerBuilder.autoCloseStream(true);
        //设置Excel文件格式
        readerBuilder.excelType(ExcelTypeEnum.XLS);
        //注册监听器进行数据的解析
        readerBuilder.registerReadListener(new AnalysisEventListener>() {

            @Override
            public void invoke(Map integerStringMap, AnalysisContext analysisContext) {
                Set keySet = integerStringMap.keySet();
                Iterator iterator = keySet.iterator();
                while (iterator.hasNext()) {
                    Integer key = iterator.next();
                    System.out.print(key + ":" + integerStringMap.get(key)+", ");
                }
                System.out.println("");
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                //通知文件读取完毕
                System.out.println("数据读取完毕");
            }
        });
        //构建读取器
        ExcelReader reader = readerBuilder.build();
        //读取数据
        reader.readAll();
        //读取完毕
        reader.finish();
    }
}

上述代码可以优化简洁点

public class ExcelTest {
    public static void main(String[] args) {
        List> list = new LinkedList<>();
        EasyExcel.read("D:\\java\\用户数据表.xls")
                .sheet()
                .registerReadListener(new AnalysisEventListener>() {

                    @Override
                    public void invoke(Map integerStringMap, AnalysisContext analysisContext) {
                        list.add(integerStringMap);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        for (Map integerStringMap : list) {
            Set keySet = integerStringMap.keySet();
            Iterator iterator = keySet.iterator();
            while (iterator.hasNext()) {
                Integer key = iterator.next();
                System.out.print(key + ":" + integerStringMap.get(key)+", ");
            }
            System.out.println("");
        }
    }
}

重点:映射成指定对象,需要创建实体类,使用 @ExcelProperty 注解完成实体类成员变量和 Excel 字段的映射。

实体类对象

@TableName("card_info")
@Data
@AllArgsConstructor
@NoArgsConstructor
@HeadStyle(horizontalAlignment = HorizontalAlignment.CENTER,verticalAlignment = VerticalAlignment.CENTER, shrinkToFit = true)//标题样式,垂直水平居中
@HeadFontStyle(fontName = "微软雅黑",fontHeightInPoints = 11,bold = false)//表头字体样式
@HeadRowHeight(value = 35)//表头行高
@ContentFontStyle(fontName = "微软雅黑",fontHeightInPoints = 11)//内容字体样式
@ContentRowHeight(value = 30)//内容行高
@ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER,verticalAlignment = VerticalAlignment.CENTER, wrapped = true)//内容样式,垂直水平居中
public class CardInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    @ExcelIgnore
    private Long id;

    /**
     * 卡片id
     */
    @ExcelProperty("cardId")
    private String cardId;

    /**
     * 真实姓名
     */
    @ExcelProperty("name")
    private String name;

    /**
     * 年龄
     */
    @ExcelProperty("age")
    private Integer age;

    /**
     * 职业
     */
    @ExcelProperty("occupation")

    private String occupation;

    /**
     * 电话号码
     */
    @ExcelProperty("phone")
    private String phone;

    /**
     * 地址
     */
    @ExcelProperty("address")
    private String address;

    /**
     * 邮箱
     */
    @ExcelProperty("email")
    private String email;

    /**
     * 公司
     */
    @ExcelProperty("company")
    private String company;

    /**
     * 0:未删除1:逻辑删除2:真正删除
     */
    @ExcelIgnore
    private Integer delFlag;

    /**
     * 用户id(不是必要)
     */
    @ExcelProperty("userId")
    private String userId;

    /**
     * 名片曝光率
     */
    /**不显示字段注解*/
    @ExcelIgnore
    private Long exposureValue;

    /**
     * 标签集合
     */
    @TableField(value="tag_list",typeHandler = FastjsonTypeHandler.class)
    @ExcelProperty("tagList")
    private String tagList;

    /**
     * 名片用户的简介
     */
    @ExcelProperty("personalProfile")
    private String personalProfile;

}

@HeadStyle / @ContentStyle 设置标题 / 内容样式

(拿去CV就能用!)EasyExcel读写Excel详细流程(图解+代码)_第1张图片

@HeadFontStyle 定制标题字体格式 

(拿去CV就能用!)EasyExcel读写Excel详细流程(图解+代码)_第2张图片

@ContentRowHeight 设置行高

@ColumnWith 设置列宽 , 作用于成员属性 

@ExcelIgnore 不将该字段转换成Excel

@ExcelProperty("xxx")指定列名的映射 

解析 Excel 文件的时候直接指定实体类即可。

public class ExcelTest {
    public static void main(String[] args) {
        List list = new LinkedList<>();
        EasyExcel.read("D:\\java\\用户数据表.xls")
                .head(ExcelData.class)
                .sheet()
                .registerReadListener(new AnalysisEventListener() {

                    @Override
                    public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
                        list.add(excelData);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        for (ExcelData excelData : list) {
            System.out.println(excelData);
        }
    }
}

结果:


写操作 

public class ExcelTest {
    public static void main(String[] args) {
        List list = parseData();
        //list写入Excel文件
        EasyExcel.write("D:\\java\\用户数据表_副本.xls")
                .head(ExcelData.class)
                .excelType(ExcelTypeEnum.XLS)
                .sheet("用户数据表")
                .doWrite(list);
    }

    public static List parseData(){
        List list = new LinkedList<>();
        // 写的数据都封装进list中
        return list;
    }
}

其实这些都是可以直接CV的,在映射封装类上以及输入输出位置上自定义就好

工具类,直接CV吧

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.apache.poi.ss.formula.functions.T;
import java.util.LinkedList;
import java.util.List;

/**
 * @author wzx
 */
public class ExcelUtil {


    /**
     * 封装Excel中的数据到指定的实体类中
     * @param typeClass 指定的实体类的字节码类别
     * @param readPath Excel的文件路径
     * @return 指定的实体类对象的集合(每个对象代表每一条数据)
     */
    public static List getDataFromExcel(Class typeClass , String readPath){
        List list = new LinkedList<>();
        EasyExcel.read(readPath)
                .head(typeClass)
                .sheet()
                .registerReadListener(new AnalysisEventListener() {

                    @Override
                    public void invoke(T excelData, AnalysisContext analysisContext) {
                        list.add(excelData);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("数据读取完毕");
                    }
                }).doRead();
        return list;
    }

    /**
     * 将封装好的数据写入Excel中
     * @param list 写入的数据集合
     * @param writePath 写入的Excel文件的路径
     * @param sheet excel表中生成的sheet表名
     * @param excelType 插入的excel的类别,有xls、xlsx两种
     */
    public static  void saveDataToExcel(List list, String writePath, String sheet, ExcelTypeEnum excelType, Class clazz) {
        // 写入Excel文件
        EasyExcel.write(writePath)
                .head(clazz)
                .excelType(excelType)
                .sheet(sheet)
                .doWrite(list);
    }
}

你可能感兴趣的:(学习笔记篇,java,excel)