java实现利⽤阿⾥巴巴开源的easyexcel进⾏对excel表格的导
⼊和导出[附完整代码]
⽬录
前⾔
平常的功能⼤家应该都会⽤到导⼊导出excel的功能,⽐如通过读excel的⽅式将excel的数据导⼊到数据库中。当然实现的⽅式有很多,今天我介绍的是利⽤阿⾥开源的easyexcel项⽬来完成功能。⼤家也可以⾃⼰看easyexcel的⽂档进⾏开发。当然这⾥因为刚好⼯作的时候⽤到了,所以将⾃⼰写的demo分享出来,⼤家就可以更快节省时间完成功能,⼤家可以参考,也可以直接拿来⽤,实际在你们⾃⼰的开发过程当中适当修改。
EasyExcel是⼀个基于Java的简单、省内存的读写Excel的开源项⽬。在尽可能节约内存的情况下⽀持读写百M的Excel。
⼀、引⼊easyexcel的maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
⾸先springBoot项⽬结构⼤家看⼀下,除了最简单的三层架构,dao、service和controller,这⾥还需要⽤到listener
⼆、读取excel代码⽰例
1、bean需要和excel的列对应
可以通过index和name将bean和excel的列对应起来,但是官⽅不建议index和name同时夹杂在⼀起⽤,顾名思义,在⼀个bean中要么就是⽤index,要么就是⽤name对应
eg:@ExcelProperty(index = 2)
eg:@ExcelProperty("⽇期标题")
demo
xx.xxxx;
import l.annotation.ExcelProperty;
import lombok.Data;
/**
* Created by yjl on 2019/12/25.
*/
@Data
public class RoomMonitorCoverDataBean {
private String TIME_ID; //时间
@ExcelProperty(index = 0)
private String PROV_NAME; //省
@ExcelProperty(index = 1)
private String AREA_NAME; //地市
@DateTimeFormat("yyyy年MM⽉")
@ExcelProperty(index = 2)
private String MONTH_DESC; //⽉份,DateTimeFormat表⽰对⽇期进⾏格式化,不要的可以去掉
public String getTIME_ID() {
return TIME_ID;
}
public void setTIME_ID(String TIME_ID) {
this.TIME_ID = TIME_ID;
}
public String getPROV_NAME() {
return PROV_NAME;
}
public void setPROV_NAME(String PROV_NAME) {
this.PROV_NAME = PROV_NAME;
}
public String getAREA_NAME() {
return AREA_NAME;
getsavefilename
}
public void setAREA_NAME(String AREA_NAME) {
this.AREA_NAME = AREA_NAME;
}
public String getMONTH_DESC() {
return MONTH_DESC;
}
public void setMONTH_DESC(String MONTH_DESC) {
this.MONTH_DESC = MONTH_DESC;
}
}
2、Controller层
很简单,就注⼊service,引⽤service的⽅法,我们在service⾥进⾏⼊参的判断或者其他业务处理等,这⾥我就直接放⼀个impl的
了,interface是⼀样的名字,放⼀个没有实现的⽅法就可以了,当然你也可以不要那个interface
demo
@RequestMapping("/mrePortController")
public class MrePortControllerCSVImpl implements IMrePortControllerCSV {
@Autowired
private MrePortServiceCSV mrePortServiceCSV;
@RequestMapping(value = "/saveRoomMonitorCoverData", method = RequestMethod.POST)
@Override
public JSONObject saveRoomMonitorCoverData(MultipartFile file, String timeType, String userArea) {
return mrePortServiceCSV.saveRoomMonitorCoverData(file, timeType,userArea);
}
}
3、service层
这⾥我们进⾏逻辑判断,可以对⼊参或者其他⼀些东西进⾏判断,
主要功能是
// 将excel表中的数据⼊库
/
/ 有个很重要的点 xxxxxListener 不能被spring管理,要每次读取excel都要new,然后⾥⾯⽤到spring可以构造⽅法传进去
// 这⾥需要指定读⽤哪个class去读,默认读取第⼀个sheet ⽂件流会⾃动关闭
@Component
public class MrePortServiceCSVImpl implements MrePortServiceCSV {
@Autowired
private MrePortDao mrePortDao;
private Logger logger = Class());
@Override
public JSONObject saveRoomMonitorCoverData(MultipartFile file, String timeType,String userArea) {
JSONObject jo = new JSONObject();
try {
//可以进⾏必传参数校验等
//这⾥省略不写了
//导⼊⽰例:excel名称:⼩⼩鱼⼉⼩⼩林_浙江201912.xlsx
String fileName = OriginalFilename().replaceAll("\\.xlsx|\\.xls","");
System.out.println("Name():"+Name()+",OriginalFilename():"+OriginalFilename());
String[] split = fileName.split("_");
String file_tableName = split[0]; //⽂件名称表名称
String file_areaNameAndDate = split[1]; //⽂件名称地市和⽉份 eg:浙江201912
//String file_version = split[2]; //⽂件名称版本号
if ("⼩⼩鱼⼉⼩⼩林".equals(file_tableName)){ //只能上传该名称的⽂件
String file_areaName = file_areaNameAndDate.substring(0, 2); //⽂件名称地市
String file_date = file_areaNameAndDate.substring(2); //⽂件名称⽉份
if (userArea.equals(file_areaName)){ //只能上传⾃⼰权限范围内的地市数据
//Long currentDate = Long.parseLong(getCurrentDate("yyyyMM"));
String currentDate = getCurrentDate("yyyyMM");
if (currentDate.equals(file_date)){ //只能上传当⽉的数据
String tableName = "xxxxxxxxx";
// 将excel表中的数据⼊库
// 有个很重要的点 xxxxxListener 不能被spring管理,要每次读取excel都要new,然后⾥⾯⽤到spring可以构造⽅法传进去
// 这⾥需要指定读⽤哪个class去读,默认读取第⼀个sheet ⽂件流会⾃动关闭
jo.put("msg","导⼊成功");
jo.put("resultCode",0);
jo.put("response","success");
}else {
jo.put("msg","您只能上传当⽉"+currentDate+"的数据");
jo.put("resultCode",-1);
jo.put("response","");
return jo;
}
}else {
jo.put("msg","您暂时没有权限上传"+file_areaName+"的数据");
jo.put("resultCode",-1);
jo.put("response","");
return jo;
}
}else {
jo.put("msg","请选择《⼩⼩鱼⼉⼩⼩林》⽂件再上传");
jo.put("resultCode",-1);
jo.put("response","");
return jo;
}
}catch (IOException i){
i.printStackTrace();
jo.put("msg","IOException,请重试");
jo.put("resultCode",-1);
jo.put("response","");
} catch (Exception e){
e.printStackTrace();
jo.put("msg","导⼊异常,请重试");
jo.put("resultCode",-1);
jo.put("response","");
}
return jo;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。