pom.xml
com.alibaba
easyexcel
3.0.5
一、Controller
@RequestMapping(value = "importExcel", method = RequestMethod.POST, headers = "content-type=multipart/form-data")
@ApiOperation(value = "导入社区")
@ApiImplicitParams({ @ApiImplicitParam(name = "文件", value = "file") })
public Result importExcel(@RequestParam(value="file") MultipartFile file) throws ControllerException {
try {
Result result = communityService.importExcel(file);
return result;
} catch (Exception e) {
return Result.failed("导入失败");
}
}
二、实体类
/**
* 社区信息
*
* @author LXF
* @email
* @date 2021-11-10 15:29:38
*/
@Data
public class Community implements Serializable {
private static final long serialVersionUID = 1L;
@JsonSerialize(using = ToStringSerializer.class)
@TableId(value = "ID", type = IdType.AUTO)
private Long id;//
private String nation;// 国家
private String province;// 省市
private String city;
private String county;// 区县
private String town;// 镇
private String community;// 村民委员会
private String village;// 社区(村)
private String address;// 地址
private String headImgUrl;// 头像
private String telephone;// 电话
private String contact;// 联系人
private String content;// 简介
@JsonSerialize(using = ToStringSerializer.class)
private Long userId;// 用户编号
private String dmsAccount;// dms账号
private String workAccount;// 工作号
private Integer enabled;// 是否启用:1启用,0屏蔽
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;// 创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;// 最近一次更新时间
@JsonSerialize(using = ToStringSerializer.class)
private Long operatorId;// *** 作者
private String operateIp;// 最近一次更新 *** 作的网址
@JsonSerialize(using = ToStringSerializer.class)
private Long version;// 版本号
}
@Data
public class CommunityImportBo implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@ExcelProperty("国家")
private String nation;
@ExcelProperty("省")
private String province;
@ExcelProperty("市")
private String city;
@ExcelProperty("区县")
private String county;
@ExcelProperty("乡镇街道")
private String town;
@ExcelProperty("居委会")
private String community;
}
三、Service
/**
* 导入社区excel
*
* @param file 文件
* @param
* @return {@link Result}
*/
Result importExcel(MultipartFile file) throws ServiceException, IOException;
四、ServiceImpl
/**
* 导入社区excel
*
* @param file 文件
* @param
* @return {@link Result}
*/
@Override
public Result importExcel(MultipartFile file) throws ServiceException, IOException {
EasyExcel.read(file.getInputStream(), CommunityImportBo.class, new ConfigFilterListener(communityDao)).sheet().doRead();
return Result.succeed("导入成功");
}
}
五、监听器
package com.ys.dms.listener;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.ys.dms.common.exception.service.ServiceException;
import com.ys.dms.common.feign.UserFeign;
import com.ys.dms.dao.CommunityDao;
import com.ys.dms.entity.Community;
import com.ys.dms.entity.vo.CommunityImportBo;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
public class ConfigFilterListener implements ReadListener {
private Logger logger = LoggerFactory.getLogger(ConfigFilterListener.class);
/**
* 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT =100;
private List list = new ArrayList<>();
private List communityList = new ArrayList<>();
/**
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
*/
@Resource
private CommunityDao communityDao;
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*
* @param
*/
public ConfigFilterListener() {
this.communityDao = communityDao;
}
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*
* @param
*/
public ConfigFilterListener(CommunityDao communityDao) {
this.communityDao = communityDao;
}
/**
* 这个每一条数据解析都会来调用
*
* @param
*
* @param context
*/
@Override
public void invoke(CommunityImportBo communityImportBo, AnalysisContext context) {
context.readWorkbookHolder().setIgnoreEmptyRow(false);
Community community = new Community();
community.setUserId(Long.valueOf("1277137734524300032"));
community.setEnabled(1);
community.setCreateTime(new Date());
BeanUtil.copyProperties(communityImportBo,community);
list.add(communityImportBo);
communityList.add(community);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (communityList.size() >= BATCH_COUNT) {
batchInsert();
// 存储完成清理 list
communityList.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
*
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
if(communityList.size() > 0){
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
batchInsert();
logger.info("所有数据解析完成!");
}
}
@Async
public void batchInsert() {
communityDao.insertBatchTwo(communityList);
log.info("存储数据库成功!");
}
}
五、Dao
//返回主键
@Options(useGeneratedKeys=true,keyProperty="id")
void insertBatchTwo(List list);
六、Dao.xml
insert into community(
nation,
province,
city,
county,
town,
community,
village,
address,
head_img_url,
telephone,
contact,
content,
user_id,
dms_account,
work_account,
enabled,
create_time,
update_time,
operator_id,
operate_ip,
version)
values
(
#{ item.nation},
#{ item.province},
#{ item.city},
#{ item.county},
#{ item.town},
#{ item.community},
#{ item.village},
#{ item.address},
#{ item.headImgUrl},
#{ item.telephone},
#{ item.contact},
#{ item.content},
#{ item.userId},
#{ item.dmsAccount},
#{ item.workAccount},
#{ item.enabled},
#{ item.createTime},
#{ item.updateTime},
#{ item.operatorId},
#{ item.operateIp},
#{ item.version}
)
个人博客:
码农日志分享互联网知识,码农日志,博客,开发者,程序猿,编程,代码,开源,IT网站,Java,JavaWeb,Java常用框架,Spring,SpringBoot,SpringMVC,MyBatis,数据库,MySQL,C#,.NET,开发工具,Git,GitHub,Gitee,(My)Eclipse,IDEA, Hexo,Linux,Maven,前端基础知识,HTML,CSS,JavaScript,jQuery,Ajax,Bootstraphttp://lixiaofang.top/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)