导出excel文件(前后端共同作用)
程序员文章站
2022-03-15 10:13:51
...
对于一些需要导出成为Excel的数据,需要通过后端编写处理数据的接口,将要插入的数据写入excel文件中。
后端代码:
public class PoiUtils {
public static ResponseEntity<byte[]> exportQ2Excel(List<Map<String, String>> list1, List<Map<String, String>> list2, List<Map<String, String>> list3) {
HttpHeaders headers = null;
ByteArrayOutputStream baos = null;
try {
//创建第一个Excel文档
HSSFWorkbook workbook = new HSSFWorkbook();
//创建Excel表单,设置sheet名称
HSSFSheet sheet1 = workbook.createSheet("a");
//设置表头
HSSFRow headerRow1 = sheet1.createRow(0);
//插入表头数据,可以多行插入,现只插入一行
headerRow1.createCell(0).setCellValue("ID");
//装数据,可以多行插入,现只插入一行
for (int i = 0; i < list1.size(); i++) {
HSSFRow row = sheet1.createRow(i + 1);
row.createCell(0).setCellValue(list1.get(i).get("ID"));
}
//创建第二个Excel表单
HSSFSheet sheet2 = workbook.createSheet("b");
//设置表头
HSSFRow headerRow2 = sheet2.createRow(0);
//插入表头数据,可以多行插入,现只插入一行
headerRow2.createCell(0).setCellValue("ID");
//装数据,可以多行插入,现只插入一行
for (int i = 0; i < list2.size(); i++) {
HSSFRow row = sheet2.createRow(i + 1);
row.createCell(0).setCellValue(list2.get(i).get("ID"));
}
//创建第三个Excel表单
HSSFSheet sheet3 = workbook.createSheet("c");
//设置表头,可以多行插入,现只插入一行
HSSFRow headerRow3 = sheet3.createRow(0);
headerRow3.createCell(0).setCellValue("ID");
//装数据,可以多行插入,现只插入一行
for (int i = 0; i < list3.size(); i++) {
HSSFRow row = sheet3.createRow(i + 1);
row.createCell(0).setCellValue(list3.get(i).get("ID"));
}
headers = new HttpHeaders();
//经过试验,此处的命名无法起作用。真正起作用的是前端的文件定义
headers.setContentDispositionFormData("attachment",
new String("aaaaa.xls".getBytes("UTF-8"), "iso-8859-1"));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
baos = new ByteArrayOutputStream();
workbook.write(baos);
} catch (IOException e) {
e.printStackTrace();
}
return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);
}
}
以上可以生成三个sheet表的excel文件,对于不需要生成多sheet的程序来说,只需要添加一个sheet即可,
下面是前端(Angular)代码:
export() {
// 此处写后端接口的地址
const url;
return this.http.get(url,
{headers: this.header, observe: 'response', responseType: 'blob'}).subscribe(response => {
// 规范下载格式,对不同的浏览器进行不同的处理,主要针对IE浏览器
this.downloadFile(response);
this.nzMessageService.success('导出成功!');
}, error => {
this.nzMessageService.error('导出失败!');
});
}
downloadFile(data: HttpResponse<Blob>) {
// 为了兼容IE
const uA = window.navigator.userAgent;
const isIE = /msie\s|trident\/|edge\//i.test(uA) && !!('uniqueID' in document || 'documentMode' in document || ('ActiveXObject' in window) || 'MSInputMethodContext' in window);
const file = new Blob([data.body], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
// const fileName = decodeURIComponent(data.headers.get('content-disposition').split('filename=')[1]);
const currentDate = new Date();
// 此处是真正的对excel表的名字进行命名的地方
const fileName = 'a-' + currentDate.getFullYear() + (currentDate.getMonth() + 1)
+ currentDate.getDate() + currentDate.getHours() + currentDate.getMinutes() + currentDate.getSeconds() + '.xls'; // 名称
if (isIE) { // 如果是IE
navigator.msSaveBlob(file, fileName);
} else {
const a = document.createElement('a');
a.id = 'tempId';
document.body.appendChild(a);
a.download = fileName;
a.href = URL.createObjectURL(file);
a.click();
// 删除<a>标签
const tempA = document.getElementById('tempId');
if (tempA) {
tempA.parentNode.removeChild(tempA);
}
}
}
以上Angular代码存在于service中,可以直接通过ts文件里进行调用,记得在html文件里面写(click)="exportTable()"
哦!这样可以实现点击执行exportTable函数中的操作,将export函数加进去,大功告成!!!
下一篇: excel下载前后端代码,防下载中文乱码