package com.dy.pipIrrGlobal.excel; 
 | 
  
 | 
import com.alibaba.excel.metadata.Head; 
 | 
import com.alibaba.excel.metadata.data.WriteCellData; 
 | 
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; 
 | 
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 com.alibaba.excel.write.style.AbstractVerticalCellStyleStrategy; 
 | 
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 
 | 
import org.apache.poi.ss.usermodel.*; 
 | 
import org.apache.poi.xssf.usermodel.DefaultIndexedColorMap; 
 | 
import org.apache.poi.xssf.usermodel.XSSFCellStyle; 
 | 
import org.apache.poi.xssf.usermodel.XSSFColor; 
 | 
import org.springframework.util.PropertyPlaceholderHelper; 
 | 
  
 | 
import java.util.List; 
 | 
import java.util.Objects; 
 | 
import java.util.Properties; 
 | 
  
 | 
/** 
 | 
 * @author ZhuBaoMin 
 | 
 * @date 2024-10-12 11:40 
 | 
 * @LastEditTime 2024-10-12 11:40 
 | 
 * @Description 总账表格设置 
 | 
 */ 
 | 
public class CellWriteHandler extends AbstractVerticalCellStyleStrategy { 
 | 
    private String title; 
 | 
  
 | 
    PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}"); 
 | 
  
 | 
    public CellWriteHandler(String title) { 
 | 
        this.title = title; 
 | 
    } 
 | 
  
 | 
    // 动态导入标题 
 | 
    @Override 
 | 
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, 
 | 
                                 Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) { 
 | 
        if (head != null) { 
 | 
            List<String> headNameList = head.getHeadNameList(); 
 | 
            if (CollectionUtils.isNotEmpty(headNameList)) { 
 | 
                Properties properties = new Properties(); 
 | 
                properties.setProperty("title", title); 
 | 
                headNameList.replaceAll(value -> propertyPlaceholderHelper.replacePlaceholders(value, properties)); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    // 设置标题样式,包含字体、背景 
 | 
    @Override 
 | 
    protected void setHeadCellStyle(CellWriteHandlerContext context) { 
 | 
        // 获取和创建CellStyle 
 | 
        WriteCellData<?> cellData = context.getFirstCellData(); 
 | 
        CellStyle originCellStyle = cellData.getOriginCellStyle(); 
 | 
        Cell cell = context.getCell(); 
 | 
  
 | 
        if (Objects.isNull(originCellStyle)) { 
 | 
            originCellStyle = context.getWriteWorkbookHolder().getWorkbook().createCellStyle(); 
 | 
        } 
 | 
  
 | 
        ((XSSFCellStyle) originCellStyle).setFillForegroundColor(new XSSFColor(new java.awt.Color(255, 255, 255), new DefaultIndexedColorMap())); 
 | 
  
 | 
        // 设置指定列背景色 
 | 
        //if(cell.getColumnIndex() == 10 
 | 
        //) { 
 | 
        //    ((XSSFCellStyle) originCellStyle).setFillForegroundColor(new XSSFColor(new java.awt.Color(237, 237, 237), new DefaultIndexedColorMap())); 
 | 
        //} 
 | 
  
 | 
        // 设置背景颜色 
 | 
        originCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
 | 
        // 由于在FillStyleCellWriteHandler,会把OriginCellStyle和WriteCellStyle合并,会以WriteCellStyle样式为主,所有必须把WriteCellStyle设置的背景色清空 
 | 
        // 具体合并规则看WriteWorkbookHolder.createCellStyle方法 
 | 
        WriteCellStyle writeCellStyle = cellData.getWriteCellStyle(); 
 | 
        writeCellStyle.setFillForegroundColor(null); 
 | 
        // 必须设置OriginCellStyle 
 | 
        cellData.setOriginCellStyle(originCellStyle); 
 | 
  
 | 
        WriteFont headWriteFont = new WriteFont(); 
 | 
        if (cell.getRowIndex() == 0) { 
 | 
            headWriteFont.setFontHeightInPoints((short)14); 
 | 
            headWriteFont.setFontName("Arial"); 
 | 
            headWriteFont.setBold(true); 
 | 
        }else if (cell.getRowIndex() == 1) { 
 | 
            headWriteFont.setFontHeightInPoints((short)12); 
 | 
            headWriteFont.setFontName("Arial"); 
 | 
            headWriteFont.setBold(false); 
 | 
        } 
 | 
  
 | 
        cellData.getWriteCellStyle().setWriteFont(headWriteFont); 
 | 
    } 
 | 
  
 | 
    // 设置内容公示、内容字体样式、背景样式 
 | 
    @Override 
 | 
    protected void setContentCellStyle(CellWriteHandlerContext context) { 
 | 
  
 | 
        // 获取和创建CellStyle 
 | 
        WriteCellData<?> cellData = context.getFirstCellData(); 
 | 
        CellStyle originCellStyle = cellData.getOriginCellStyle(); 
 | 
        Cell cell = context.getCell(); 
 | 
  
 | 
        if (Objects.isNull(originCellStyle)) { 
 | 
            originCellStyle = context.getWriteWorkbookHolder().getWorkbook().createCellStyle(); 
 | 
        } 
 | 
        // 设置背景颜色 
 | 
        ((XSSFCellStyle) originCellStyle).setFillForegroundColor(new XSSFColor(new java.awt.Color(255, 192, 0), new DefaultIndexedColorMap())); 
 | 
        //System.out.println("Go to row: " +  context.getCell().getRowIndex() + ", column: " +  context.getCell().getColumnIndex()); 
 | 
  
 | 
        if (cell.getRowIndex() >= 2){ 
 | 
            ((XSSFCellStyle) originCellStyle).setFillForegroundColor(new XSSFColor(new java.awt.Color(237, 237, 237), new DefaultIndexedColorMap())); 
 | 
  
 | 
            //if (cell.getColumnIndex() == 10){ 
 | 
            //    int actualCellRowNum =  context.getCell().getRowIndex() + 1; 
 | 
            //    context.getCell().setCellFormula("I" + actualCellRowNum +"+J" + actualCellRowNum); 
 | 
            //} 
 | 
        } 
 | 
  
 | 
        originCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
 | 
        originCellStyle.setBorderLeft(BorderStyle.THIN);                    //左边框线 
 | 
        originCellStyle.setBorderTop(BorderStyle.THIN);                     //顶部框线 
 | 
        originCellStyle.setBorderRight(BorderStyle.THIN);                   //右边框线 
 | 
        originCellStyle.setBorderBottom(BorderStyle.THIN);                  //底部框线 
 | 
        // 由于在FillStyleCellWriteHandler,会把OriginCellStyle和WriteCellStyle合并,会以WriteCellStyle样式为主,所有必须把WriteCellStyle设置的背景色清空 
 | 
        // 具体合并规则看WriteWorkbookHolder.createCellStyle方法 
 | 
        WriteCellStyle writeCellStyle = cellData.getWriteCellStyle(); 
 | 
        writeCellStyle.setFillForegroundColor(null); 
 | 
        writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); 
 | 
        writeCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); 
 | 
        // 必须设置OriginCellStyle 
 | 
        cellData.setOriginCellStyle(originCellStyle); 
 | 
  
 | 
        WriteFont headWriteFont = new WriteFont(); 
 | 
        headWriteFont.setFontHeightInPoints((short)12); 
 | 
        headWriteFont.setFontName("宋体"); 
 | 
        headWriteFont.setBold(false); 
 | 
        headWriteFont.setColor(IndexedColors.BLACK.getIndex()); 
 | 
  
 | 
        cellData.getWriteCellStyle().setWriteFont(headWriteFont); 
 | 
    } 
 | 
} 
 |