Vue后端实现Excel下载
目录
Vue+后端实现Excel下载
后端
@PostMapping("/exportAttendanceHistory")
public ResponseEntity exportAttendanceHistory(@RequestBody WcrWorkAttendanceDetailsHistory param){
XSSFWorkbook book = new XSSFWorkbook();
try {
List<WcrWorkAttendanceDetailsHistory> list = iWcrWorkAttendanceDetailsHistoryService.exportAttendanceHistory(param);
if (!CollectionUtils.isEmpty(list)) {
XSSFSheet sheet = book.createSheet("mySheent");
String[] vals = {"姓名", "班级名称","课程名称","上课老师","课程节次", "教室位置","周次", "签到时间", "考勤结果","生成日期"};
createExcel(sheet, 0, vals);
for(int i = 0;i<list.size();i++){
String[] vals2 = new String[]{list.get(i).getXm(),
list.get(i).getBmMc(),
list.get(i).getKcmc(),
list.get(i).getSkls(),
list.get(i).getJc(),
list.get(i).getQymc(),
list.get(i).getWeek(),
list.get(i).getCheckInTime() == null ? "未打卡" : list.get(i).getCheckInTime().toString(),
list.get(i).getKqjg(),
list.get(i).getScrq()};
createExcel(sheet,i + 1, vals2);
}
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
book.write(outputStream);
book.close();
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Content-Disposition", String.format("attachment; filename=%s", "历史考勤信息.xlsx"));
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
headers.add("Access-Control-Expose-Headers", "Content-Disposition");
return ResponseEntity
.ok()
.headers(headers)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(outputStream.toByteArray());
}catch(Exception e){
e.printStackTrace();
}
return null;
}
private void createExcel(XSSFSheet sheet, int rowNo, String[] vals) {
if (vals.length > 0) {
XSSFRow row = sheet.createRow(rowNo);
for (int i = 0; i < vals.length; i++) {
String val = vals[i];
XSSFCell cell = row.createCell(i);
cell.setCellValue(val);
}
}
}
前端
<el-button icon="el-icon-download" size="medium" v-loading="exportLoading" element-loading-text="拼命下载中" type="primary" @click="exportExcel">导出</el-button>
exportExcel(){
this.exportLoading = true;
exportAttendanceHistory(this.attendanceDetail).then(res=>{
if(!res) {
this.$notify.error({
title: '操作失败',
message: '文件下载失败'
})
}
const url = window.URL.createObjectURL(res.data)
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
// 获取服务器端的文件名
link.setAttribute('download', "历史考勤信息.xlsx")
document.body.appendChild(link)
link.click()
this.exportLoading = false;
})
},