EasyExcel 学习之 导出 “提示问题”
- 现象
- 分析
- 解决(伪代码)
- 前端 POST 实现
- 后端实现
现象
EasyExcel
支持导出 xlsx
、xls
、csv
三种文件格式。在导出过程中可能发生各种异常,当发生异常时应该提示错误信息而非导出一个错误的文件。
分析
- 首先,后端应该支持两种不同格式(content-type)内容的返回
- 其次,前端应该支持两种不同格式(content-type)内容的解析处理
解决(伪代码)
前端 POST 实现
const axios = require('axios');
axios({
url: 'https://api.example.com/export',
method: 'post',
data: {
param1: 'value1',
param2: 'value2'
},
responseType: 'blob',
headers: {
'Authorization': 'Bearer YOUR_TOKEN'
}
})
.then(response => {
if (response.data && response.data.type == 'application/json') {
const render = new FileReader();
reader.onload = (e) => {
let content = e.target.result;
content = JSON.parse(content);
this.$antMessage.info(content.msg);
}
} else {
var blob = new Blob([response.data]);
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', name);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
})
.catch(error => {
console.error('Error:', error);
});
后端实现
if (errorCondition) {
throw new BusinessException('errorCode', 'errorMsg');
}
response.setContentType(ExcelConst.MEDIA_TYPE_EXCEL);
response.setHeader(ExcelConst.CONTENT_DISPOSITION, String.format("%s:%s=%s.%s", ExcelConst.ATTACHMENT, ExcelConst.FILENAME, System.currentTimeMillis(), ExcelTypeEnum.XLSX.getValue()));
try (OutputStream os = response.getOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
ExcelWriter excelWriter = EasyExcel.write(baos)
.charset(Charset.forName("GBK")) // 或者 UTF-8
.autoCloseStream(true)
.excludeColumnFieldNames(Lists.newArrayList())
.excelType(ExcelTypeEnum.XLSX).build();
WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, sheetName).head(clazz).build();
excelWriter.write(sheetData, writeSheet);
excelWriter.finish();
os.write(baos.toByteArray());
} catch (Exception e) {
log.error(String.format("Excel 导出失败!%s", ""), e);
}