前端代码vue3
import { message } from 'ant-design-vue'
export default {
// 对下载的流进行处理,直接从浏览器下载下来
resultDownload(res) {
if (res.data.type === 'application/json') {
// 错误以及无权限
const reader = new FileReader(res.data)
reader.readAsText(res.data)
reader.onload = () => {
const result = JSON.parse(reader.result)
message.error(result.msg)
}
} else {
const blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
const contentDisposition = res.headers['content-disposition']
const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
const $link = document.createElement('a')
$link.href = URL.createObjectURL(blob)
$link.download = decodeURIComponent(patt.exec(contentDisposition)[1])
$link.click()
document.body.appendChild($link)
document.body.removeChild($link) // 下载完成移除元素
window.URL.revokeObjectURL($link.href) // 释放掉blob对象
}
}
}
//导出调用
const exportBatch = (params) => {
saleManagerApi.export().then((res) => {
downloadUtil.resultDownload(res)
})
}
后端
pom.xml文件引入
<properties>
<easyexcel.version>3.2.1</easyexcel.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
Java代码部分
//Controller层
@ApiOperationSupport(order = 6)
@ApiOperation("导出数据列表")
@CommonLog("导出数据列表")
@GetMapping(value = "/saleManager/areasalesman/export", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void export(SaleAreaSalesmanExportParam exportParam, HttpServletResponse response) throws IOException {
saleAreaSalesmanService.export(exportParam, response);
}
//Service层
void export(SaleAreaSalesmanExportParam exportParam, HttpServletResponse response) throws IOException;
//ServiceImpl层
@Override
public void export(SaleAreaSalesmanExportParam exportParam, HttpServletResponse response) throws IOException {
File tempFile = null;
try {
List<SaleAreaSalesmanExportResult> exportList = this.baseMapper.getExportData(exportParam);
// ......过滤可导出数据部分
String fileName = "数据清单.xlsx";
if (ObjectUtil.isEmpty(exportList)) {
throw new CommonException("无数据可导出");
}
List<SaleAreaSalesmanExportResult> exportResultList = exportList.stream()
.map(salesmanResult -> {
SaleAreaSalesmanExportResult salesmanExportResult = new SaleAreaSalesmanExportResult();
BeanUtil.copyProperties(salesmanResult, salesmanExportResult);
// 状态枚举转为文字
salesmanExportResult.setUserStatus(salesmanExportResult.getUserStatus()
.equalsIgnoreCase("ENABLE") ? "在职" : "离职");
return salesmanExportResult;
}).collect(Collectors.toList());
// 创建临时文件
tempFile = FileUtil.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName);
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short) 14);
headWriteCellStyle.setWriteFont(headWriteFont);
// 水平垂直居中
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 内容背景白色
contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
WriteFont contentWriteFont = new WriteFont();
// 内容字体大小
contentWriteFont.setFontHeightInPoints((short) 12);
contentWriteCellStyle.setWriteFont(contentWriteFont);
//设置边框样式,细实线
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
// 水平垂直居中
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle,
contentWriteCellStyle);
// 写excel
EasyExcel.write(tempFile.getPath(), SaleAreaSalesmanExportResult.class)
// 自定义样式
.registerWriteHandler(horizontalCellStyleStrategy)
// 自动列宽
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
// 设置第一行字体
.registerWriteHandler(new CellWriteHandler() {
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
WriteCellData<?> cellData = context.getFirstCellData();
WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
Integer rowIndex = context.getRowIndex();
if (rowIndex == 0) {
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontName("宋体");
headWriteFont.setBold(true);
headWriteFont.setFontHeightInPoints((short) 16);
writeCellStyle.setWriteFont(headWriteFont);
}
}
})
// 设置表头行高
.registerWriteHandler(new AbstractRowHeightStyleStrategy() {
@Override
protected void setHeadColumnHeight(Row row, int relativeRowIndex) {
if (relativeRowIndex == 0) {
// 表头第一行
row.setHeightInPoints(34);
} else {
// 表头其他行
row.setHeightInPoints(30);
}
}
@Override
protected void setContentColumnHeight(Row row, int relativeRowIndex) {
// 内容行
row.setHeightInPoints(20);
}
})
.sheet("sheet1")
.doWrite(exportResultList);
CommonDownloadUtil.download(tempFile, response);
} catch (Exception e) {
log.error(">>> 数据导出失败:", e);
CommonResponseUtil.renderError(response, "数据导出失败");
} finally {
FileUtil.del(tempFile);
}
}