EasyExcel合并列 EasyExcel合并 easyexcel合并 列 easyexcel合并 EsayExcel样式 EsayExcel自定义样式 easyexcel 样式

EasyExcel合并列 EasyExcel合并 easyexcel合并 列 easyexcel合并

效果图

在这里插入图片描述

调用

public void test1(){
    
    
LinkedList<WorkstationMaintenancePerformanceDetailsVO> linkedList = getData();
        // 根据用户传入字段 假设我们只要导出 date
        Set<String> includeColumnFiledNames = new HashSet<String>();
        includeColumnFiledNames.add("maintenanceDate");
        includeColumnFiledNames.add("maintenanceName");
        includeColumnFiledNames.add("workerLevel");
        includeColumnFiledNames.add("modelId");
        includeColumnFiledNames.add("model");
        includeColumnFiledNames.add("difficulty");
        includeColumnFiledNames.add("skillLevel");
        includeColumnFiledNames.add("levelTargetNumber");
        includeColumnFiledNames.add("maintenanceNumber");
        includeColumnFiledNames.add("excessUnitPrice");
        includeColumnFiledNames.add("taskProportion");
        includeColumnFiledNames.add("dayCumulativeProportion");
        // 请求头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment;filename=" + new String(("维修绩效明细").getBytes(), StandardCharsets.ISO_8859_1) + ".xlsx");
        // 使用 HttpServletResponse 写
        try (OutputStream outputStream = response.getOutputStream()) {
    
    
            // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
            EasyExcel.write(outputStream, WorkstationMaintenancePerformanceDetailsVO.class)
                    .registerWriteHandler(new WorkstationMaintenancePerformanceDetailsMergeStrategy(linkedList.size(), 0, 1)) // 第一列进行合并
                    .registerWriteHandler(horizontalCellStyleStrategyBuilder.horizontalCellStyleStrategyBuilder()) // 表格样式
                    .includeColumnFiledNames(includeColumnFiledNames) // 要导出的列
                    .sheet("维修绩效明细")// shell名称
                    .doWrite(linkedList); // 写的数据
            outputStream.flush();
        } catch (IOException ignored) {
    
    
        }
}

合并实现类

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.commons.collections.map.HashedMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * <h2>日维修绩效明细excel表合并实现类</h2>
 * <p>
 *
 * </p>
 *
 * @author 
 * @since 
 */
public class WorkstationMaintenancePerformanceDetailsMergeStrategy extends AbstractMergeStrategy {
    
    

    // 合并的列编号,从0开始,指定的index或自己按字段顺序数
    private final Set<Integer> mergeCellIndex = new HashSet<>();
    // 记录上一次合并的信息
    private final Map<Integer, MergeRange> lastRow = new HashedMap();
    // 数据集大小,用于区别结束行位置
    private Integer maxRow = 0;

    // 禁止无参声明
    private WorkstationMaintenancePerformanceDetailsMergeStrategy() {
    
    
    }
	
	/**
	*
	* @param maxRow 数据集大小,用于区别结束行位置
	* @param mergeCellIndex 合并开始 - 到结束的列下标
	**/
    public WorkstationMaintenancePerformanceDetailsMergeStrategy(Integer maxRow, int... mergeCellIndex) {
    
    
        Arrays.stream(mergeCellIndex).forEach(this.mergeCellIndex::add);
        this.maxRow = maxRow;
    }

    // 每行每列都会进入,绝对不要在这写循环
    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
    
    
        int currentCellIndex = cell.getColumnIndex();
        // 判断该行是否需要合并
        if (mergeCellIndex.contains(currentCellIndex)) {
    
    
            String currentCellValue = cell.getStringCellValue();
            int currentRowIndex = cell.getRowIndex();
            if (!lastRow.containsKey(currentCellIndex)) {
    
    
                // 记录首行起始位置
                lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));
                return;
            }
            //有上行这列的值了,拿来对比.
            MergeRange mergeRange = lastRow.get(currentCellIndex);
            if (!(mergeRange.lastValue != null && mergeRange.lastValue.equals(currentCellValue))) {
    
    
                // 结束的位置触发下合并.
                // 同行同列不能合并,会抛异常
                if (mergeRange.startRow != mergeRange.endRow || mergeRange.startCell != mergeRange.endCell) {
    
    
                    sheet.addMergedRegionUnsafe(new CellRangeAddress(mergeRange.startRow, mergeRange.endRow, mergeRange.startCell, mergeRange.endCell));
                }
                // 更新当前列起始位置
                lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));
            }
            // 合并行 + 1
            mergeRange.endRow += 1;
            // 结束的位置触发下最后一次没完成的合并
            if (relativeRowIndex.equals(maxRow - 1)) {
    
    
                MergeRange lastMergeRange = lastRow.get(currentCellIndex);
                // 同行同列不能合并,会抛异常
                if (lastMergeRange.startRow != lastMergeRange.endRow || lastMergeRange.startCell != lastMergeRange.endCell) {
    
    
                    sheet.addMergedRegionUnsafe(new CellRangeAddress(lastMergeRange.startRow, lastMergeRange.endRow, lastMergeRange.startCell, lastMergeRange.endCell));
                }
            }
        }
    }
}

class MergeRange {
    
    
    public int startRow;
    public int endRow;
    public int startCell;
    public int endCell;
    public String lastValue;

    public MergeRange(String lastValue, int startRow, int endRow, int startCell, int endCell) {
    
    
        this.startRow = startRow;
        this.endRow = endRow;
        this.startCell = startCell;
        this.endCell = endCell;
        this.lastValue = lastValue;
    }
}

表格样式实现类

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;

/**
 * <h2>EasyExcel表格样式工具类</h2>
 * <p>
 *
 * </p>
 *
 * @author 
 * @since 
 */
public class horizontalCellStyleStrategyBuilder {
    
    
    private static HorizontalCellStyleStrategy cellStyleStrategy;

    /**
     * 返回 样式策略
     *
     * @return {@link  HorizontalCellStyleStrategy}
     */
    public static HorizontalCellStyleStrategy horizontalCellStyleStrategyBuilder() {
    
    
        if (cellStyleStrategy == null) {
    
    
            // 头的策略
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            // 背景设置为红色
            headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
            WriteFont headWriteFont = new WriteFont();
            headWriteFont.setFontHeightInPoints((short) 25);
            headWriteFont.setColor(IndexedColors.WHITE.getIndex());
            headWriteCellStyle.setWriteFont(headWriteFont);
            //设置头居中
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);


            // 内容的策略
            WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
            //设置 水平居中
            contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            //垂直居中
            contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

            // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
            // contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
            // 背景绿色
            // contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());

            WriteFont contentWriteFont = new WriteFont();
            // 字体大小
            contentWriteFont.setFontHeightInPoints((short) 20);
            contentWriteCellStyle.setWriteFont(contentWriteFont);

            // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
            cellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        }
        return cellStyleStrategy;

    }
}

猜你喜欢

转载自blog.csdn.net/qq_40739917/article/details/129281128
今日推荐