1. 前言:
easyexcel的版本为3.0以上的版本
1.1. 参考文档
2.0版本
复杂表头官方文档, 官方文档
EasyExcel复杂表头的导出样式自定义(字体,大小,主副标题不同底色,行高)
3.0版本参考文档:
1.2. 效果图
推荐使用新版本,效果如下
2. 代码实现
2.1. 引入Maven依赖
两个版本的在实现标题和内容样式的时候,代码有所不同,设置标题高度的代码是通用的
2.1.1. 引入依赖
引入3.3.3版本
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
2.2. 定义写入到excel的对象
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* 写入到excel的对象
*/
@Data
@NoArgsConstructor
public class EasyExcelExportUserDTO {
@ColumnWidth(20)
@ExcelProperty(value = {"我是说明:\n1、此表格仅供内部学习,禁止对外传播和扩散\n2、仅导出部分信息"
,"用户名称"}, index = 0)
private String userName;
@ColumnWidth(25)
@ExcelProperty(value = {"我是说明:\n1、此表格仅供内部学习,禁止对外传播和扩散\n2、仅导出部分信息"
,"用户编号"}, index = 1)
private String userNo;
@ColumnWidth(25)
@ExcelProperty(value = {"我是说明:\n1、此表格仅供内部学习,禁止对外传播和扩散\n2、仅导出部分信息"
,"年龄"}, index = 2)
private Integer age;
}
2.3. 自定义表头的高度
这部分代码,在2.0版本和3.0版本是通用的
import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;
import org.apache.poi.ss.usermodel.Row;
/**
* 设置自定义模板表头的高度
*/
public class CellRowHeightStyleStrategy extends AbstractRowHeightStyleStrategy {
@Override
protected void setHeadColumnHeight(Row row, int relativeRowIndex) {
// 设置第一个表头的高度为900
if(relativeRowIndex == 0){
//如果excel需要显示行高为15,那这里就要设置为15*20=300
// 一行文字, 高度为300应该够了
row.setHeight((short) (900));
}
}
@Override
protected void setContentColumnHeight(Row row, int i) {
}
}
2.4. 3.0版本自定义标题和内容的样式
import com.alibaba.excel.metadata.data.DataFormatData;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.AbstractVerticalCellStyleStrategy;
import org.apache.poi.ss.usermodel.*;
/**
* 3.0版本的easyexcel, 自定义表头和内容的样式
*/
public class CustomVerticalCellStyleStrategy extends AbstractVerticalCellStyleStrategy {
private boolean errorExcel = false;
public CustomVerticalCellStyleStrategy() {}
public CustomVerticalCellStyleStrategy(boolean errorExcel) {
this.errorExcel = errorExcel;
}
@Override
protected WriteCellStyle headCellStyle(CellWriteHandlerContext context) {
Cell cell = context.getCell();
WriteCellStyle headCellStyle = new WriteCellStyle();
WriteFont headWriteFont = new WriteFont();
headWriteFont.setBold(false);
headWriteFont.setFontName("等线");
headWriteFont.setFontHeightInPoints((short)11);
headCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
headCellStyle.setWriteFont(headWriteFont);
headCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 设置表头的样式
if (0 == cell.getRowIndex()) {
headCellStyle.setWrapped(true);
headCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
} else if (1 == cell.getRowIndex()){
headCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
headCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
}
return headCellStyle;
}
@Override
protected WriteCellStyle contentCellStyle(CellWriteHandlerContext context) {
Cell cell = context.getCell();
// 第三列设置为文本格式
int contentColumnIndex = cell.getColumnIndex();
WriteCellStyle contentCellStyle = new WriteCellStyle();
WriteFont headWriteFont = new WriteFont();
headWriteFont.setBold(false);
headWriteFont.setFontName("等线");
contentCellStyle.setWriteFont(headWriteFont);
contentCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
contentCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
if (1 == contentColumnIndex) {
DataFormatData dataFormatData = new DataFormatData();
dataFormatData.setIndex((short)49);
contentCellStyle.setDataFormatData(dataFormatData);
}
return contentCellStyle;
}
}
2.5. 写入数据到excel
package com.tool.demo.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.google.common.collect.Lists;
import com.tool.demo.dto.ResGoodsBarcodeScaleExcel4PlatformDTO;
import com.tool.demo.strategy.BarCodeGoodsCellRowHeightStyleStrategy;
import com.tool.demo.strategy.BarCodeGoodsCellStyleStrategy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 工具类
*/
public class ExcelUtil {
public static void main(String[] args) {
// 创建ExcelWriterBuilder
ExcelWriterBuilder excelWriterBuilder = EasyExcel.write("output.xlsx", ResGoodsBarcodeScaleExcel4PlatformDTO.class);
BarCodeGoodsCellStyleStrategy barCodeGoodsHeadCellStyleStrategy =
new BarCodeGoodsCellStyleStrategy(new WriteCellStyle(), new WriteCellStyle());
// 主标题和副标题在excel中分别是是第0和第1行
List<Integer> columnIndexes = Arrays.asList(0, 1);
barCodeGoodsHeadCellStyleStrategy.setRowIndexes(columnIndexes);
// 3.0版本的代码
excelWriterBuilder
.registerWriteHandler(new CustomVerticalCellStyleStrategy())
.registerWriteHandler(new BarCodeGoodsCellRowHeightStyleStrategy());
ExcelWriter excelWriter = excelWriterBuilder.build();
writeDataNew(excelWriter);
// 千万别忘记关闭流
excelWriter.finish();
}
}