使用 layui: js 端
//执行实例
var uploadInst = upload.render({
elem: '#btnImport' // 按钮id
, url: Feng.ctxPath +'/geyeDeviceNumPool/uploadExcel'
,accept: 'file'
,before:function (obj) {
// 上传前事件
layer.load() // 开启loading
}
, done: function (res) {
//上传完毕回调
layer.closeAll('loading'); //关闭loading
table.reload(GeyeDeviceNumPool.tableId, {
where: {}, page: {curr: 1}
});
}
, error: function () {
//请求异常回调
layer.closeAll('loading'); //关闭loading
}
});
后端控制器:
使用 hutool poi
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
/**
* 上传excel填报
*/
@RequestMapping("/uploadExcel")
@ResponseBody
public ResponseData uploadExcel(@RequestPart("file") MultipartFile file) {
try {
// 查看 hutool文档 , 可进行流读取, 也可以文件方式, 或者其他方式
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
// 设置别名映射 , 方便读取映射为实体
reader.addHeaderAlias("设备编码", "deviceNum");
reader.addHeaderAlias("设备密码", "devicePwd");
reader.addHeaderAlias("设备类型", "deviceType");
// 是否需要读取上传excel的所有sheet内容
// 获取sheet 页数, 遍历读取所有sheet页的所有内容
List<Sheet> sheets = reader.getSheets();
for (int i = 0; i < sheets.size(); i++) {
reader.setSheet(i);
List<GeyeDeviceNumPool> readAll = reader.readAll(GeyeDeviceNumPool.class);
readAll.stream().forEach(v -> {
LambdaQueryWrapper<GeyeDeviceNumPool> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(GeyeDeviceNumPool::getDeviceNum, v.getDeviceNum());
// 判断库中是否存在, 不存在再新增
// 数据量少使用, 多的话可以考虑把数据先全读出来, 做计算,
// 或者考虑使用缓存,
if (geyeDeviceNumPoolService.count(queryWrapper) == 0) {
geyeDeviceNumPoolService.save(v);
}
});
}
} catch (Exception e) {
throw new ServiceException(BizExceptionEnum.UPLOAD_ERROR);
}
return ResponseData.success();
}