java使用easyExcel读取excel文件
java使用easyExcel读取excel文件前言1:这是一个读取简单Excel的栗子2:这里只写了读取,后面有时间会写一个生成Excel的Demo。1.准备工作创建一个Excel:bookInfo.xlsxmaven引入easyExcel<!--读写excel之前使用过1.1.2 beat1会产生精度问题,建议使用稳定版本的 easyexcel --><dependency&
·
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软件(免费的)进行测试
更多推荐
所有评论(0)