easyexcel 3.0版本自定义标题(表头)和内容样式

5,991 阅读2分钟

1. 前言:

easyexcel的版本为3.0以上的版本

1.1. 参考文档

2.0版本

复杂表头官方文档, 官方文档

EasyExcel复杂表头的导出样式自定义(字体,大小,主副标题不同底色,行高)

3.0版本参考文档:

easyExcel给表格的每一列设置不同样式

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();
        
    }
}