@Data
@EqualsAndHashCode(callSuper = false)
@TableName("sys_user_info")
public class UserInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "user_id", type = IdType.AUTO)
@ExcelIgnore
private Long userId;
@ExcelProperty("用户名")
private String username;
@ExcelProperty("密码")
private String password;
@ExcelProperty("真实姓名")
private String realName;
@ApiModelProperty(value = "角色",example = "1",dataType = "Integer")
@ExcelProperty("角色")
private Integer roleId;
}
@Autowired
private UserInfoService userInfoService;
@PostMapping(value="/test1/import")
public String importExcel(@RequestParam(name = "file") MultipartFile file) throws IOException {
userInfoService.importExcel(file);
return "导入成功";
}
public interface UserInfoService extends IService<UserInfo> {
void importExcel(MultipartFile file) throws IOException;
}
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
@Resource
private UserInfoMapper userInfoMapper;
@Override
public void importExcel(MultipartFile file) throws IOException {
long beforeTime = System.currentTimeMillis();
EasyExcel.read(file.getInputStream(),
UserInfo.class,
new ImportExcelListener(userInfoMapper)).sheet().headRowNumber(1).doRead();
long afterTime = System.currentTimeMillis();
log.info("耗时:{}", afterTime - beforeTime);
}
}
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@Async
void insertBatch(List<UserInfo> list);
}
<!--批量插入-->
<insert id="insertBatch">
insert into sys_user_info(`username`, password, real_name, role_id)
values
<foreach collection="list" item="user" separator=",">
(#{user.username}, #{user.password},#{user.realName}, #{user.roleId})
</foreach>
</insert>
@Log4j2
public class ImportExcelListener<T> extends AnalysisEventListener<T> {
private static final int BATCH_COUNT = 1000;
private List<UserInfo> cachedData = new ArrayList<>(BATCH_COUNT);
private UserInfoMapper baseDaoMapper;
public ImportExcelListener(UserInfoMapper baseDaoMapper) {
this.baseDaoMapper = baseDaoMapper;
}
@Override
public void invoke(T t, AnalysisContext analysisContext) {
log.info("解析到一条数据:{}", JSON.toJSONString(t));
cachedData.add((UserInfo) t);
if(cachedData .size() >= BATCH_COUNT){
batchSaveData();
cachedData = new ArrayList<>(BATCH_COUNT);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
batchSaveData();
}
@Async
public void batchSaveData() {
log.info("{}条数据,开始存储数据库!", cachedData.size());
baseDaoMapper.insertBatch(cachedData);
log.info("存储数据库成功!");
}
private List<List<String>> head = new ArrayList<>();
private List<List<String>> data = new ArrayList<>();
public List<List<String>> getHead() {
return this.head;
}
public List<List<String>> getData() {
return this.data;
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
EasyExcelErrorFixUtil.setExcelErrorHead(headMap, head);
}
@Override
public void onException(Exception exception, AnalysisContext context) {
EasyExcelErrorFixUtil.setErrorData(exception, context, data, head.size());
if(!CollectionUtils.isEmpty(data)){
for (List<String> list : head) {
for (String column : list) {
System.out.print(column+ " ");
}
}
System.out.println();
for (List<String> datum : data) {
for (int i = 0; i < datum.size(); i++) {
if(i == 0){
System.out.print((Integer.parseInt(datum.get(i))+1)+" ");
continue;
}
System.out.print(datum.get(i)+" ");
}
System.out.println();
}
throw new RuntimeException("有错误数据!");
}
}
}
class EasyExcelErrorFixUtil {
public static void setErrorData(Exception exception, AnalysisContext context, List<List<String>> data, int size) {
if (exception instanceof ExcelDataConvertException) {
ExcelDataConvertException convertException = (ExcelDataConvertException) exception;
int row = convertException.getRowIndex();
int column = convertException.getColumnIndex();
Map<Integer, Cell> cellMapResult = context.readRowHolder().getCellMap();
List<String> dataList = new ArrayList<>();
dataList.add(Integer.toString(row));
for (int i = 0; i < size; i ++) {
if(cellMapResult.get(i) == null) {
dataList.add(null);
} else if(column == i) {
dataList.add("{格式错误}--" + cellMapResult.get(i).toString());
} else {
dataList.add(cellMapResult.get(i).toString());
}
}
data.add(dataList);
}
}
public static void setExcelErrorHead(Map<Integer, String> headMap, List<List<String>> head) {
List<String> errorTips = new ArrayList<>();
errorTips.add("错误数据行");
head.add(errorTips);
for(Map.Entry<Integer, String> entry: headMap.entrySet()) {
List<String> errorHead = new ArrayList<>();
errorHead.add(entry.getValue());
head.add(errorHead);
}
}
}