对于像数据库中批量添加数据,我们一般会选择通过Excel文件先按照固定的格式将数据保存,然后再通过系统上传进而保存到数据库中。
阿里的excel解析工具EasyExcel
和Apach的POI
都能进行Excel文件的解析,但是EasyExcel操作起来要相对更简单一些,这里我们选用VUE+EasyExcel的方式来进行数据的上传和解析。
POI解析Excel文件:https://blog.csdn.net/weixin_45890113/article/details/115742939
前端:上传Excel文件,在前端进行校验,只能上传excel文件
<div>
批量上传员工信息:
<label for="file-upload" class="button">选择文件label>
<input
type="file"
id="file-upload"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
@change="handleFileUpload"
style="display: none"
/>
div>
......
methods: {
handleFileUpload (event) {
const file = event.target.files[0];
if (file.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' &&
file.type !== 'application/vnd.ms-excel') {
alert('只能上传 Excel 文件');
return;
}
const formData = new FormData();
formData.append('file', file);
fetch(this.'上传文件的URL地址', {
method: 'POST',
body: formData
})
.then(response => {
insertBatch().then(rst => {
let { code, page, msg } = rst.data;
if (code === '0000') {
this.loading = false;
this.data = rst.data.data;
this.page.total = page.sum;
this.page.current = page.currentPage;
this.findByPage(this.page);
this.page.currentSize = this.$isEmpty(this.data) ? 0 : this.data.length;
} else {
this.$Message.error(msg);
}
});
})
.catch(error => {
console.error(error);
});
},
......
}
......
<style>
.button {
display: inline-block;
background-color: #42b983;
color: #fff;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
}
style>
后端:接收到前端传输的文件后,将其读取到内存中,再通过EasyExcel对其进行解析
Controller层代码
@PostMapping("/uploadFile")
public void uploadFile(MultipartFile file) {
csEquipmentWbbList = csEquipmentWbbService.uploadFile(file) ;
}
Service层代码
// 接口
List<CsEquipmentWbb> uploadFile(MultipartFile file);
-------------------------------------------------------------------------------------
// 实现
@Override
public List<CsEquipmentWbb> uploadFile(MultipartFile file) {
EquipmentDeviceListener listener = new EquipmentDeviceListener();
try {
InputStream inputStream = file.getInputStream();
EasyExcel.read(inputStream , EquipmentDevice.class , listener).sheet().doRead();
List<CsEquipmentWbb> csEquipmentWbbList = new ArrayList<>() ;
List<EquipmentDevice> equipmentDeviceList = listener.getEquipmentDeviceList() ;
for (EquipmentDevice equipmentDevice : equipmentDeviceList) {
CsEquipmentWbb csEquipmentWbb = beanCopyUtils.convertTo(equipmentDevice, CsEquipmentWbb.class);
csEquipmentWbbList.add(csEquipmentWbb) ;
}
return csEquipmentWbbList ;
} catch (Exception e) {
log.error(e.getMessage() , e);
}
return null;
}
这里我们需要去创建一个listener监听器
,通过继承AnalysisEventListener
类并重写其中的方法来达到对Excel文件的解析。
AnalysisEventListener类的介绍:
AnalysisEventListener 是 EasyExcel 中提供的一种事件监听器,用于处理 Excel 文件的读取和写入等操作。通常情况下,我们可以通过继承 AnalysisEventListener 并重写其中的回调方法来实现对 Excel 文件的读取和写入操作。在读取 Excel 文件时,我们可以使用 AnalysisEventListener 的 invoke() 方法来获取每行数据并进行处理。同时,doAfterAllAnalysed() 方法会在 Excel 文件解析完成后被调用,我们可以在该方法中对读取到的数据进行统一处理或保存等操作。
对于EquipmentDevice
类,我们需要根据自身情况去具体的设置,如果说excel文件中的数据就是刚好能符合后端接收数据的对象的属性,那么我们无需再定义一个类去接收。如果excel文件中只是包含了个别字段,那么我们最好再去定义一个新的类先将数据接收并保存,再将数据copy给指定的类的集合。
public class EquipmentDeviceListener extends AnalysisEventListener<EquipmentDevice> {
List<EquipmentDevice> equipmentDeviceList = new ArrayList<>() ;
public List<EquipmentDevice> getEquipmentDeviceList() {
return equipmentDeviceList;
}
@Override
public void invoke(EquipmentDevice equipmentDevice, AnalysisContext analysisContext) {
equipmentDeviceList.add(equipmentDevice) ;
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 我们解析得到的数据也可以直接在该方法中进行进一步的处理,我是写到了service层去处理的
}
}
通过上面的代码我们就能实现前端传输Excel文件到后端进行解析的操作了,最终得到一个集合,再进一步对集合中数据进行相应的操作即可