美文网首页工具类
四、EasyExcel自定义导出样式

四、EasyExcel自定义导出样式

作者: 任未然 | 来源:发表于2020-06-06 18:29 被阅读0次

    一、概述

    EasyExcel做导入导出都很简单,但修改excel的样式却有很多小伙伴不太了解,其实也不是很难,跟Apache POI的样式设置差不多,今天结合实例给同学们分享一下

    二、实例

    现在我想导出这种效果,表头和表行都有部分字段为红色,如下图

    excel样式

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

    相关文章

      网友评论

        本文标题:四、EasyExcel自定义导出样式

        本文链接:https://www.haomeiwen.com/subject/wlaxtktx.html