1.导入Maven坐标
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
2.创建实体类
@Data
@EqualsAndHashCode(callSuper = false)
// TODO 注意:此实体类的字段顺序不能改变,也可以在字段上添加@ExcelProperty(value = {"学生信息","序号"},order = i)
public class MetaTableFieldDomain implements Serializable {
private static final long serialVersionUID=1L;
/**
* 数据元标识符
*/
//@ExcelProperty(value = {"数据元标识符"},order = 0)
private String dataidentifier;
/**
* 英文编码
*/
private String englishcode;
/**
* 中文名称
*/
private String chinesename;
/**
* 定义
*/
private String definition;
/**
* 字段类型
*/
private String fieldtype;
/**
* 字段说明
*/
private String fielddescription;
/**
* 值域代码
*/
private String rangcode;
/**
* 表名
*/
private String tablename;
}
3.创建实现AnalysisEventListener的监听器
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.xyhsoft.framework.core.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class ExcelListener extends AnalysisEventListener<MetaTableFieldDomain> {
private static ExcelListener ExcelListener ;
private String tablename;
private List<Integer> integerList = new ArrayList<>();
@Autowired
private IMetaTableField iMetaTableFieldManger;
@PostConstruct
public void init() {
ExcelListener = this;
ExcelListener .iMetaTableFieldManger = this.iMetaTableFieldManger;
}
public ExcelListen(String tablename) {
this.tablename = tablename;
}
ExcelListener (){}
// 一行一行读取 excel 内容
@Override
public void invoke(MetaTableFieldDomain metaDatabaseBo, AnalysisContext analysisContext) {
if ("null".equals(tablename)) {
throw new ServiceException(String.valueOf(UnifyErrorCode.TABLE_NAME_NOT_FOUND));
}
Integer integer = null;
//业务
Integer toCount = ExcelListener .iMetaTableFieldManger.selectByDataidentifierAndEnglishcode(metaDatabaseBo.getDataidentifier(), metaDatabaseBo.getEnglishcode());
if (toCount != 0) {
integer = 0;
} else {
metaDatabaseBo.setTablename(tablename);
//保存到数据库
integer = ExcelListener.iMetaTableFieldManger.save(metaDatabaseBo);
}
integerList.add(integer);
}
// 读取完成之后
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
public Map<String, Integer> getCount() {
Map<String, Integer> countMap = new HashMap<>();
int counts = 0;
for (Integer count : integerList) {
if (count == 1) {
counts = counts + 1;
}
}
countMap.put("成功插入条数:", counts);
countMap.put("插入失败条数:", integerList.size() - counts);
countMap.put("总条数:", integerList.size());
return countMap;
}
}
4.具体的实体类Impl
@Override
public Map<String, Integer> importExcel(MultipartFile file, String tablename) {
String filename = file.getOriginalFilename();
String name = filename.substring(filename.lastIndexOf(".")+1);
if ("xls".equals(name) || "xlsx".equals(name)){
}else {
throw new IllegalArgumentException("文件格式不符上传标准");
}
if (file == null) {
throw new IllegalArgumentException("文件不能为空");
}
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
} catch (IOException e) {
throw new IllegalArgumentException("解析文件异常");
}
ExcelListen excelListen = new ExcelListen(tablename);
EasyExcel.read(inputStream, MetaTableFieldDomain.class, excelListen).sheet().doRead();
return excelListen.getCount();
}
5.xls文件内容
此顺序要是实体类字段顺序对应(字段添加@ExcelProperty除外)
测试即可!