java excel处理-easyExcel

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

easyExcel

导入依赖(easyexcel依赖中已经有poi的依赖)

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>
复制代码

字段实体类

public class excel {
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private int aDouble;
​
    public excel() {
    }
​
    public excel(String string, Date date, int aDouble) {
        this.string = string;
        this.date = date;
        this.aDouble = aDouble;
    }
​
    public String getString() {
        return string;
    }
​
    public void setString(String string) {
        this.string = string;
    }
​
    public Date getDate() {
        return date;
    }
​
    public void setDate(Date date) {
        this.date = date;
    }
​
    public int getaDouble() {
        return aDouble;
    }
​
    public void setaDouble(int aDouble) {
        this.aDouble = aDouble;
    }
}
​
复制代码

指定列的前后顺序

@ExcelProperty(value = "姓名",index = 1)
    private String string;
    @ExcelProperty(value = "日期",index = 2)
    private Date date;
    @ExcelProperty(value = "学号",index = 0)
    private int aDouble;
复制代码

如果指定列写入,那么忽略的列就会空出来

复杂头

@ExcelProperty({"主标题", "字符串标题"})
    private String string;
    @ExcelProperty({"主标题", "日期标题"})
    private Date date;
    @ExcelProperty({"主标题", "数字标题"})
    private int aDouble;
复制代码

image.png

写入

将数据写入list

   //写入list
    private List<excel> data(){
        List< excel > excels = new ArrayList<>();
        for(int i = 0;i < 10; i++){
            excel e = new excel();
            e.setaDouble(i);
            e.setString("yzy");
            e.setDate(new Date());
            excels.add(e);
        }
        return excels;
    }
复制代码

简单的写入方法

list写入excel

 //将list写入excel
    @Test
    public void write(){
        //   第一个参数为路径,第二个参数为标题的实体类
//          然后写入木板,再将执行list方法
        EasyExcel.write(PATH+"easy.xlsx",excel.class).sheet("模板").doWrite(data());
    }
复制代码

image.png

指定列写入

set用来存储需要忽略的列名,add指定忽略的列,列明为字段名

public void daochuzhidinglie(){
        /*忽略到导出的列*/
​
        Set<String> set = new HashSet<>();
        set.add("aDouble");
        //过滤写入
        EasyExcel.write(PATH+"导出指定列1.xlsx",excel.class).excludeColumnFiledNames(set).sheet("1").doWrite(data());
​
        /*指定要导出的列*/
        /*//set用来存储需要忽略的列名
        Set<String> set1 = new HashSet<>();
        set1.add("date");
        set1.add("string");
        //过滤写入
        EasyExcel.write(PATH+"导出指定列1.xlsx",excel.class).includeColumnFiledNames(set1).sheet("指定学号名称").doWrite(data());
   */ }
复制代码

忽略学号

image.png

注意点,如果指定了列的顺序,那么指定列写入就会使其他的列空着

image.png

写入图片

public void pic() throws Exception {
        //InputStream inputStream = null;
        ArrayList< excel > excels = new ArrayList<>();
        excel excel = new excel();
        //图片路径
        String picPath = PATH+"1.jpg";
     /*五种类型的图片*/
        excel.setBytes(FileUtils.readFileToByteArray(new File(picPath)));
        //excel.setFile(new File(picPath));
        //excel.setPic(picPath);
        //inputStream = FileUtils.openInputStream(new File(picPath));
        //excel.setUrl(new URL(""));
​
        excels.add(excel);
        EasyExcel.write(PATH+"pic.xlsx",excel.class).sheet().doWrite(excels);
        //inputStream.close();
    }
复制代码

image.png

读取

监听器

读取exccel数据,需要一个监听器用于判断 每次读取100条数据就进行保存操作,由于每次读都是新new UserInfoDataListener的,所以这个list不会存在线程安全问题. 读取到的数据会变成JSON字符串打印出来,放入list中,判断list存的数据是否超过限度,超过就存入数据库并将list清空

public class UserInfoDataListener extends AnalysisEventListener<excel> {
    
    private static final int BATCH_COUNT = 100;
    List<excel> list = new ArrayList<>();
​
    @Override
    //excel 类型
    //AnalysisContext 分析上下文
    public void invoke(excel data, AnalysisContext analysisContext) {
        System.out.println("解析到一条数据:{}"+ JSON.toJSONString(data));
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }
​
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        System.out.println("所有数据解析完成!");
    }
​
    //写入数据库的业务
    private void saveData() {
        System.out.println("{}条数据,开始存储数据库!" +list.size());
        //userService.save(list);
        System.out.println("存储数据库成功!");
    }
}
复制代码

读取方法: read的第三个参数是监听器用于判断list中的数据是否存入数据库

@Test
    public void read(){
        
        EasyExcel.read(PATH+"easy.xlsx",excel.class,new UserInfoDataListener()).sheet().doRead();
    }
复制代码

image.png

猜你喜欢

转载自juejin.im/post/7034537923559030821