java使用easyExcel读取excel文件

java使用easyExcel读取excel文件

前言

1:这是一个读取简单Excel的栗子
2:这里只写了读取,后面有时间会写一个生成Excel的Demo。

1.准备工作

创建一个Excel:bookInfo.xlsx
在这里插入图片描述

maven引入easyExcel

		<!--  读写excel  之前使用过1.1.2 beat1会产生精度问题,建议使用稳定版本的 easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>

备注:之前用的版本不对,读取结果很不理想(获取到了奇奇怪怪的数据结果)。后面换成了2.2.6版本就OK了。

2.Excel对应的Model

model中定义了属性对应的excel列位置

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

@Data
public class BookInfoExcelModel {
    @ExcelProperty(value = "书籍名称", index = 0) // 定义表头名称和位置,0代表第一列
    private String bookName;
    @ExcelProperty(value = "书籍价格", index = 1)
    private BigDecimal bookPrice;
    @ExcelProperty(value = "书籍作者", index = 2)
    private String bookAuther;
    @ExcelProperty(value = "书籍类别", index = 3)
    private String bookType;
    @ExcelProperty(value = "珍本标识", index = 4)
    private String rareFlag;
    @ExcelProperty(value = "出版社", index = 5)
    private String press;
    @ExcelProperty(value = "出版日期", index = 6)
    private Date pressDate;
    @ExcelProperty(value = "备注", index = 7)
    private String remark;
}

3.创建Excel监听类

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.executer.bookInfo.model.BookInfoExcelModel;
import com.example.demo.executer.bookInfo.service.BookInfoService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;

import java.util.LinkedList;
import java.util.concurrent.ExecutorService;

@Slf4j
public class BookInfoExcelListener extends AnalysisEventListener<BookInfoExcelModel> {

    private BookInfoExcelModel bookInfoExcelModel;
	//BookInfoService 提供插入数据库的接口
    //private BookInfoService bookInfoService;
	//TODO 这个引入了线程池,当Excel数据量大时,可以快速处理。可以去掉
    //private ExecutorService executorService;


    /**
     * 自定义用于暂时存储data
     * 可以通过实例获取该值
     */
    private LinkedList<BookInfoExcelModel> datas = new LinkedList<BookInfoExcelModel>();

	//要使用线程池,可以放开这个注释
//    public BookInfoExcelListener(BookInfoExcelModel bookInfoExcelModel, BookInfoService bookInfoService,ExecutorService executorService) {
//        this.bookInfoExcelModel = bookInfoExcelModel;
//        this.bookInfoService = bookInfoService;
//        this.executorService = executorService;
//    }

    public BookInfoExcelListener(BookInfoExcelModel bookInfoExcelModel) {
        this.bookInfoExcelModel = bookInfoExcelModel;
    }

    public BookInfoExcelListener() {
    }

    @Override
    public void invoke(BookInfoExcelModel bookInfoExcelModel, AnalysisContext analysisContext) {
        //readerId由 a-z|A-Z|0-9|_ 组成的是正确数据  可以过滤数据
//        if(Pattern.matches("\\w*",blackListExcel.getReaderId())){
        datas.add(bookInfoExcelModel);
//        }
        //根据自己业务做处理
    }


    @SneakyThrows
    @Override
    @Transactional
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        datas.forEach(data -> {
            log.info("date:{}",date);
           //考虑到导入书籍数量可能上十万,此处使用线程池
           // executorService.execute(()->{
           //    bookInfoService.insertByExcel(data);
           // });
        });
    }

}

4.controller层实现调用

 @RequestMapping("importExcel")
    public BaseResponse importExcel(MultipartFile file){
        try{
            log.info("------------importExcel start------------");
            //实例化监听
            ExcelReader excelReader = EasyExcel.read(file.getInputStream(), BookInfoExcelModel.class, new BookInfoExcelListener(new BookInfoExcelModel())).build();
            //读取excel第一页内容
            ReadSheet readSheet = EasyExcel.readSheet(0).build();
            //读取Excel
            excelReader.read(readSheet);
            //这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
            excelReader.finish();
            log.info("------------importExcel end------------");
            return new BaseResponse(ResultEnum.SUCCESS);
        }catch (Exception e){
            e.printStackTrace();
            log.error("导入表异常:"+e);
            return new BaseResponse(ResultEnum.FAIL,e.getMessage());
        }
    }

5.测试方法

可以使用postman软件(免费的)进行测试java使用easyExcel读取excel文件_第1张图片

你可能感兴趣的:(java)