ajax调接口处理表格
show you my codes.
页面新增按钮
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312"/>
<title>中登网信息导入</title>
</head>
<body>
<div style="width:90%;margin-top:5px;margin-left: 40px">
<table style="width:100%;">
<tr>
<td>
<div style="margin-top:5px;margin-left:10px;">
<font style="font-size:16px;color:#6FB3E0;">
上传中登网信息文件,点击【导入】进行上传,仅支持.xlsx或.xls格式。
</font>
</div>
</td>
</tr>
</table>
</div>
<div style="width:90%;margin-top:5px;margin-left: 60px">
<table style="width:100%;">
<tr>
<td>
<form id="uploadForm" enctype="multipart/form-data" method="post">
<input id="file" type="file" name="file" accept=".xls,.xlsx">
</form>
</td>
<td>
<input type="button" id="upload" value="导入">
</td>
<td></td>
<td></td>
</tr>
</table>
</div>
<br>
<script type="text/javascript" language="JavaScript">
$('#upload').click(function () {
let formData = new FormData($('#uploadForm')[0]);
if(document.getElementById('file').files[0] == null){
alert("请选择一个要上传的文件!");
return;
}
$.ajax({
type: 'POST',
url: '/mogo/api/netRegister/netRegisterExcelDetail',
data: formData,
cache: false,
processData: false,
contentType: false,
}).success(function (data) {
if (data.code === '0000') {
alert("导入成功!");
document.getElementById('uploadForm')&&document.getElementById('uploadForm').reset();
} else {
alert("导入失败!");
}
}).error(function () {
alert("导入失败");
});
});
</script>
</body>
</html>
接口编写
controller
@Controller
@Slf4j
@RequestMapping("/netRegister")
public class NetRegisterController {
@Autowired
NetRegisterInformationService netRegisterInfoService;
@RequestMapping("/netRegisterExcelDetail")
@ResponseBody
public GeneralResponse zdwExcelDetail(@RequestParam("file") MultipartFile file) throws IOException {
return netRegisterInfoService.zdwExcelDetail(file);
}
}
serviceImpl
/**
* 中登网excel文件操作
*
* @param file excel表格文件
*/
@Override
public GeneralResponse zdwExcelDetail(MultipartFile file) throws IOException {
if (file.isEmpty()) {
return GeneralResponse.fail("文件为空!");
}
int begin = file.getOriginalFilename().indexOf(".");
int last = file.getOriginalFilename().length();
String extension = file.getOriginalFilename().substring(begin, last);
if (".xlsx".equals(extension) || ".xls".equals(extension)) {
// excel数据读取并存到数据库中
EasyExcel.read(file.getInputStream(), NetRegisterEntity.class, new NetRegisterInfoListener(this)).sheet().doRead();
}
return GeneralResponse.success();
}
service
public interface NetRegisterInformationService {
/**
* 中登网excel文件操作
*
* @param file excel表格文件
*/
GeneralResponse zdwExcelDetail(MultipartFile file) throws IOException;
}
实体类
@Data
public class NetRegisterEntity {
/**
* 申请编号
*/
private String asqbh;
/**
* 中登网修改码
*/
@ExcelProperty(index = 1)
private String contractNo;
/**
* 中登网修改码
*/
@ExcelProperty(index = 13)
private String modificationCode;
/**
* 中登网编号
*/
@ExcelProperty(index = 14)
private String netNumber;
/**
* 登记日期
*/
@ExcelProperty(index = 15)
@DateTimeFormat("yyyy/MM/dd")
private String registerDate;
}
监听器
@Slf4j
public class NetRegisterInfoListener extends AnalysisEventListener<NetRegisterEntity> {
private static final Logger LOGGER = LoggerFactory.getLogger(NetRegisterInfoListener.class);
/**
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 520;
List<NetRegisterEntity> list = new ArrayList<NetRegisterEntity>();
private int failSum = 0;
private int successSum = 0;
/**
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
*/
private NetRegisterInformationService service;
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*
* @param service
*/
public NetRegisterInfoListener(NetRegisterInformationService service) {
this.service = service;
}
/**
* 会一行行得返回头
*
* @param headMap
* @param context
*/
@Override
public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
// log.info("解析到一条头数据:{}", JSON.toJSONString(headMap));
}
/**
* 这个每一条数据解析都会来调用
*
* @param data
* @param analysisContext
*/
@Override
public void invoke(NetRegisterEntity data, AnalysisContext analysisContext) {
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}
/**
* 数据解析完了开始调用
*
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
log.info("所有数据解析完成!成功条数:{}, 失败条数:{}", successSum, failSum);
}
/**
* 存储数据库
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", list.size());
Map<String, List<String>> map = service.saveOrUpdate(list);
failSum += map.get("fail").size();
successSum += map.get("success").size();
log.info("存储数据库成功!");
}
}