最近在研究一个java项目,需要实现一个导出功能,后端用的是EasyExcel组件,版本是3.3.3版本,导出功能很简单。但是我想要实现Excel中加入标题,已经给表头自定义样式。折腾了半天,终于解决了,记录下来方便以后查看。 后端主要代码:
// 1. 首先创建一个样式策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 设置表头字体
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short) 12); // 表头字体大小
headWriteCellStyle.setWriteFont(headWriteFont);
// 2. 构建样式策略对象
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle());
com.alibaba.excel.EasyExcel.write(response.getOutputStream())
.head(head)
.relativeHeadRowIndex(1) // 关键:把表头下移一行
.registerWriteHandler(horizontalCellStyleStrategy)
.registerWriteHandler(new com.alibaba.excel.write.handler.SheetWriteHandler() {
@Override
public void afterSheetCreate(com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder wb,
com.alibaba.excel.write.metadata.holder.WriteSheetHolder sh) {
org.apache.poi.ss.usermodel.Sheet sheet = sh.getSheet();
org.apache.poi.ss.usermodel.Row r0 = sheet.createRow(0);
org.apache.poi.ss.usermodel.Cell c0 = r0.createCell(0);
c0.setCellValue(title);
org.apache.poi.ss.usermodel.CellStyle titleStyle = sheet.getWorkbook().createCellStyle();
org.apache.poi.ss.usermodel.Font titleFont = sheet.getWorkbook().createFont();
titleFont.setFontHeightInPoints((short) 16); // 标题字体大小 16
titleFont.setBold(true); // 标题加粗
titleStyle.setFont(titleFont);
titleStyle.setAlignment(org.apache.poi.ss.usermodel.HorizontalAlignment.CENTER);
c0.setCellStyle(titleStyle);
sheet.addMergedRegion(new org.apache.poi.ss.util.CellRangeAddress(0, 0, 0, Math.max(colCount - 1, 0)));
}
})
.sheet("导出数据")
.doWrite(rows);
主要就是给Excel第一行增加标题,以及给表头自定义样式,比如大小,字体颜色等。 前端代码:
public exportData() {
//查询参数
this.search_params = {
}
const title = '导出数据.xls'
const exportParam = Object.assign({}, this.search_params, { responseType: 'blob' })
this.$http.submit('get', 'mybusiness/export', {}, exportParam, '.el-main').then((res: any) => {
const reader = new FileReader()
reader.onload = (e: any) => {
const nav = window.navigator as any
try {
const errData = JSON.parse(e.target.result)
if (errData.code != 200 || errData.message) {
return this.$message.warning(errData?.message || '导出失败')
} else {
if (nav && nav.msSaveOrOpenBlob) {
nav.msSaveBlob(res, title)
} else {
let a = document.createElement('a')
a.download = title
a.href = window.URL.createObjectURL(res)
a.click()
}
}
} catch (err) {
if (nav && nav.msSaveOrOpenBlob) {
nav.msSaveBlob(res, title)
} else {
let a = document.createElement('a')
a.download = title
a.href = window.URL.createObjectURL(res)
a.click()
}
}
}
reader.readAsText(res)
})
}
前端用的是VUE,后端是JAVA,实现起来还是挺简单,就不知道后端导出会不会影响性能。