一、概述
EasyExcel做导入导出都很简单,但修改excel的样式却有很多小伙伴不太了解,其实也不是很难,跟Apache POI的样式设置差不多,今天结合实例给同学们分享一下
二、实例
现在我想导出这种效果,表头和表行都有部分字段为红色,如下图
2.1 编写样式处理类
3.1 表头样式处理类
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.StyleUtil;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.*;
import java.util.List;
@Slf4j
public class TitleColorSheetWriteHandler implements CellWriteHandler {
//操作行
private List<Integer> columnIndexs;
//操作列
private List<Integer> rowIndexs;
//颜色
private Short colorIndex;
//构造
public TitleColorSheetWriteHandler(List<Integer> rowIndexs, List<Integer> columnIndexs, Short colorIndex) {
this.rowIndexs = rowIndexs;
this.columnIndexs = columnIndexs;
this.colorIndex = colorIndex;
}
public TitleColorSheetWriteHandler() {
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 只处理第一行
if( 0 == cell.getRowIndex()){
// 设置列宽
Sheet sheet = writeSheetHolder.getSheet();
sheet.setColumnWidth(cell.getColumnIndex(), 14 * 256);
// 设置行高
writeSheetHolder.getSheet().getRow(0).setHeight((short)(1.8*256));
// 获取workbook
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
// 获取样式实例
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 获取字体实例
WriteFont headWriteFont = new WriteFont();
// 设置字体样式
headWriteFont.setFontName("宋体");
// 设置字体大小
headWriteFont.setFontHeightInPoints((short)14);
// 边框
headWriteFont.setBold(true);
headWriteCellStyle.setWriteFont(headWriteFont);
// 设置背景颜色为灰色
headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
if (CollectionUtils.isNotEmpty(columnIndexs) &&
CollectionUtils.isNotEmpty(rowIndexs) &&
colorIndex != null &&
cell.getRowIndex() == 0 &&
columnIndexs.contains(cell.getColumnIndex())) {
// 设置指定单元格字体自定义颜色
headWriteFont.setColor(colorIndex);
}
// 获取样式实例
CellStyle cellStyle = StyleUtil.buildHeadCellStyle(workbook, headWriteCellStyle);
// 单元格设置样式
cell.setCellStyle(cellStyle);
}
}
}
3.2 表行样式处理类
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.StyleUtil;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.*;
import java.util.List;
@Slf4j
public class CellColorSheetWriteHandler implements CellWriteHandler {
//操作行
private List<Integer> columnIndexs;
//操作列
private List<Integer> rowIndexs;
//颜色
private Short colorIndex;
//构造
public CellColorSheetWriteHandler(List<Integer> rowIndexs, List<Integer> columnIndexs, Short colorIndex) {
this.rowIndexs = rowIndexs;
this.columnIndexs = columnIndexs;
this.colorIndex = colorIndex;
}
public CellColorSheetWriteHandler() {
}
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
//不处理第一行
if(0 != cell.getRowIndex()){
// 根据单元格获取workbook
Workbook workbook = cell.getSheet().getWorkbook();
//设置行高
writeSheetHolder.getSheet().getRow(cell.getRowIndex()).setHeight((short)(1.4*256));
// 单元格策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 设置背景颜色白色
contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
// 设置垂直居中为居中对齐
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置左右对齐为靠左对齐
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
// 设置单元格上下左右边框为细边框
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
// 创建字体实例
WriteFont cellWriteFont = new WriteFont();
// 设置字体大小
cellWriteFont.setFontHeightInPoints((short)12);
if (CollectionUtils.isNotEmpty(columnIndexs) &&
CollectionUtils.isNotEmpty(rowIndexs) &&
colorIndex != null &&
rowIndexs.contains(cell.getRowIndex()) &&
columnIndexs.contains(cell.getColumnIndex())) {
// 设置指定单元格字体颜色
cellWriteFont.setColor(colorIndex);
}
contentWriteCellStyle.setWriteFont(cellWriteFont);
CellStyle cellStyle = StyleUtil.buildHeadCellStyle(workbook, contentWriteCellStyle);
cell.setCellStyle(cellStyle);
}
}
}
3.3 编写工具类
/**
* 导出表头必填字段标红色
* @param outputStream 输入流
* @param dataList 导入数据
* @param headList 表头列表
* @param sheetName sheetname
* @param cellWriteHandlers
*/
public static void writeExcelWithModel(OutputStream outputStream, List<? extends Object> dataList, List<String> headList, String sheetName, CellWriteHandler... cellWriteHandlers) {
List<List<String>> list = new ArrayList<>();
if(headList != null){
headList.forEach(h -> list.add(Collections.singletonList(h)));
}
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 单元格策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 初始化表格样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcel.write(outputStream).head(list).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy);
if(null != cellWriteHandlers && cellWriteHandlers.length>0){
for(int i = 0 ; i < cellWriteHandlers.length;i++){
excelWriterSheetBuilder.registerWriteHandler(cellWriteHandlers[i]);
}
}
// 开始导出
excelWriterSheetBuilder.doWrite(dataList);
}
/**
* 导出表头必填字段标红色
* @param outputStream 输入流
* @param dataList 导入数据
* @param headList 表头列表
* @param sheetName sheetname
* @param cellWriteHandlers
*/
public static void writeExcelWithModel(OutputStream outputStream, List<? extends Object> dataList, Class<? extends Object> headList, String sheetName, CellWriteHandler... cellWriteHandlers) {
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 单元格策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 初始化表格样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcel.write(outputStream,headList).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy);
if(null != cellWriteHandlers && cellWriteHandlers.length>0){
for(int i = 0 ; i < cellWriteHandlers.length;i++){
excelWriterSheetBuilder.registerWriteHandler(cellWriteHandlers[i]);
}
}
// 开始导出
excelWriterSheetBuilder.doWrite(dataList);
}
使用示例
public static void main(String[] args) throws Exception {
// 输出流
OutputStream outputStream = null;
outputStream = new FileOutputStream(new File("D:\\1.xlsx"));
// 导出的数据
List<TestVO> dataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
TestVO testVO = new TestVO();
testVO.setAge(i + 20);
testVO.setName("vo" + i);
testVO.setSchool("school" + i);
dataList.add(testVO);
}
// 标题
List<String> headList = Arrays.asList("姓名", "年龄", "学校");
String sheetName = "导出文件";
List<Integer> columnIndexs = Arrays.asList(0,1,2);
List<Integer> rowIndexs = Arrays.asList(0);
TitleColorSheetWriteHandler titleColorSheetWriteHandler = new TitleColorSheetWriteHandler(rowIndexs, columnIndexs, IndexedColors.RED.index);
List<Integer> columnIndexs1 = Arrays.asList(0,1);
List<Integer> rowIndexs1 = Arrays.asList(1,2,3,4);
CellColorSheetWriteHandler colorSheetWriteHandler = new CellColorSheetWriteHandler(rowIndexs1, columnIndexs1, IndexedColors.RED.index);
writeExcelWithModel(outputStream, dataList, headList, sheetName, titleColorSheetWriteHandler,colorSheetWriteHandler);
}