使用easyExcel批量导入导出数据
easyexcel
快速、简洁、解决大文件内存溢出的java处理Excel工具
项目地址:https://gitcode.com/gh_mirrors/ea/easyexcel
免费下载资源
·
excel在工作中比较常用了,对于需要批量导入的需求,一般都是使用excel。excel导入常用poi,但是POI使用繁琐,而且对内存消耗大,这篇文章就是使用easyexcel来解析数据
场景一:将数据批量导出,生成excel,输出到本地
首先导入easyexcel的pom依赖,接下来就开始解析excel了
第一步,创建excel中需要输出的字段,构建java实体
//使用easyexcel写数据,需要先建立表格对应的实体类
public class ExcelEntity {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("分数")
private Integer score;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignore;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public String getIgnore() {
return ignore;
}
public void setIgnore(String ignore) {
this.ignore = ignore;
}
@Override
public String toString() {
return "WriteExcelEntity{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
", ignore='" + ignore + '\'' +
'}';
}
}
第二步,将数据封装到excel中,然后将excel输出到本地
/**
* 往excel表格里写入数据
*/
public class WriteExcelService {
//将需要输出的数据写入list
private List<ExcelEntity> data(){
List<ExcelEntity> list=new ArrayList<ExcelEntity>();
for (int i=0;i<10;i++){
ExcelEntity writeExcelEntity=new ExcelEntity();
writeExcelEntity.setName("李白"+i);
writeExcelEntity.setAge(10+i);
writeExcelEntity.setScore(60+i);
list.add(writeExcelEntity);
}
return list;
}
//将list中的值写入excel,生成excel
@Test
public void simpWrite(){
//指定输出的excel的路径以及名称
String fileName="D:/分数统计表.xlsX";
//指定按照哪个实体写数据,默认写入第一个sheet,并指定sheet名称
EasyExcel.write(fileName,ExcelEntity.class).sheet("分数统计").doWrite(data());
}
}
这样就将数据导出到本地了
场景二:解析excel中的数据,转化为java字段
第一步:创建excel中字段的java实体类
public class ExcelEntity {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("分数")
private Integer score;
/**
* 忽略这个字段
*/
@ExcelIgnore
private String ignore;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public String getIgnore() {
return ignore;
}
public void setIgnore(String ignore) {
this.ignore = ignore;
}
@Override
public String toString() {
return "WriteExcelEntity{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
", ignore='" + ignore + '\'' +
'}';
}
}
第二步:创建excel监听器
/**
* 使用easyexcel读取数据需要先建立监听器监听excel
*/
public class ReadExcelListener extends AnalysisEventListener<ExcelEntity> {
//如果有需要将读取到的数据插入数据库的话,默认是每5条插入数据库
private static final int BATCH_SIZE =5;
List<ExcelEntity> list=new ArrayList<ExcelEntity>();
//
//这里就不插入数据库里了,直接将读取的数据输出出来作为演示
/**
*自动注入dao
*
*/
@Autowired
private ExccelMapper excelMapper;
// public ReadExcelListener(){
// excelMapper=new ExccelMapper();
// }
// public ReadExcelListener(){
// this.excelMapper=excelMapper;
// }
/**
* 数据读取的核心方法,读取数据会执行这个方法
* ExcelEntity:表格对应的实体
* AnalysisContext:分析上下文
* @param excelEntity
* @param analysisContext
*/
@Override
public void invoke(ExcelEntity excelEntity, AnalysisContext analysisContext) {
//将读取到的数据输出,JSON.toJSONString(excelEntity就是通过fastjson将数据转化
System.out.println(JSON.toJSONString(excelEntity));
list.add(excelEntity);
//当读取的数据量达到设定的批量规模后,执行插入数据库方法,
// 否则将读取的数据都读取出来不插入的话,容易造成内存溢出,下面入库的方法这里就不写了
// if (list.size()>=BATCH_SIZE){
// excelMapper.saveData(list);
// //将插入成功的数据从list清除掉
// list.clear();
// }
}
/**
* 所有数据读取完了都会调用的方法
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//在这里也要保存数据,确保最后遗留的数据也存储到数据库
//excelMapper.saveData(list);
System.out.println("所有数据解析完成");
}
}
第三步:编写插入数据入库的代码
@Service
/**
* 在实际开发中,还是要按照mvc的规范来写数据的持久化,
* 这里只要是为了方便演示效果,就不写入库的操作了
*/
public class ExccelMapper {
//持久化操作
public void saveData(List<ExcelEntity> list){};
}
第四步:解析数据
public class ReadExcelService {
@Test
public void simpleRead(){
//需要读取的数据,在实际开发中应该是先上传excel文件,再解析excel,这里就直接指定本地的文件了
String fileName="D:/分数统计表.xlsX";
//这里需要指定读取的文件,用哪个class去读,
// 读取第几个sheet的数据,默认是第一个sheet
EasyExcel.read(fileName,ExcelEntity.class,new ReadExcelListener()).sheet().doRead();
}
}
上面代码只是例子,实际开发中,需要自己根据业务字段做相应处理变动。但是步骤和代码里的方法是不变的、
大家有什么不懂的可以问我
GitHub 加速计划 / ea / easyexcel
14
5
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:4 个月前 )
c42183df
Bugfix 4 个月前
efa7dff6 * 重新加回 `commons-io`
4 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)