zoukankan      html  css  js  c++  java
  • EasyExcel使用及自定义设置单元格样式

    固定模板方式,首先创建要Excel数据列模板;当然EasyExcel 中也可以动态自定义表头,其实都差不多一样

    下面案例中,我采用一个固定模板方式,主要记录下,如何自定义单元格样式

    这里是导出方法,主要是绑定样式,指定Excel文件生成的路径

    public static String ExcelWrite(ExportParamDto excelData) {
    
            String fileName = getPath() + System.currentTimeMillis() + ".xlsx";
            // 头的策略
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            // 背景色
            headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
            WriteFont headWriteFont = new WriteFont();
            headWriteFont.setFontHeightInPoints((short) 12);
            headWriteCellStyle.setWriteFont(headWriteFont);
            // 内容的策略
            WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
            // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
    //        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
    //        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
            // 背景绿色
    //        contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
            // 字体策略
            WriteFont contentWriteFont = new WriteFont();
            // 字体大小
            contentWriteFont.setFontHeightInPoints((short) 12);
            contentWriteCellStyle.setWriteFont(contentWriteFont);
    
            //设置 自动换行
            contentWriteCellStyle.setWrapped(true);
            //设置 垂直居中
            contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    //        //设置 水平居中
    //        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
    //        //设置边框样式
    //        contentWriteCellStyle.setBorderLeft(DASHED);
    //        contentWriteCellStyle.setBorderTop(DASHED);
    //        contentWriteCellStyle.setBorderRight(DASHED);
    //        contentWriteCellStyle.setBorderBottom(DASHED);
    
            // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
            HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                    new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    
            // 方法3 如果写到不同的sheet 不同的对象
            // 这里 指定文件
            ExcelWriter excelWriter = EasyExcel.write(fileName).build();
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
            WriteSheet writeSheet;
            List<SheetAndMapListDto> testList = excelData.getSheetAndMapListDtoList();
            for (int i = 0; i < testList.size(); i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
                writeSheet = EasyExcel.writerSheet(i, testList.get(i).getRealSheetName())
                        .head(TestProTplDto.class)
                        .registerWriteHandler(horizontalCellStyleStrategy)
                        .registerWriteHandler(new CustomCellWriteHandler())
                        .build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                excelWriter.write((ArrayList) testList.get(i).getMapList(), writeSheet);
            }
            // finish 关闭流
            excelWriter.finish();
    
    
            return fileName;
    
    
        }

    关于自定义绑定单元格样式,查了很多,要么版本不匹配要么实现有问题,

    转来翻去,突然发现如图这一段,这是官网给的Demo中生成Excel时绑定 表头的样式,官网也有提到可以 注册监听方法

     想到这,思路一下就开阔起来了,那么我们是不是也可以写一个 监听方法,在监听方法中,实现对单元格样式的控制呢?

    实现如下

    我们自定义一个类实现 CellWriteHandler 接口

    这里面有个坑,相比大家已经看到了 这个类中注释掉的方法了,

    看了官网 自定义拦截器。对第一行第一列的头超链接到xxx

    其中 案例中实现 beforeCellCreate,afterCellCreate 在代码中报错,,

    接下来只能 看看CellWriteHandler 接口的参数,按照如下重新实现下

    public class CustomCellWriteHandler implements CellWriteHandler {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(CustomCellWriteHandler.class);
    
    //    @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 beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, int columnIndex, boolean isHead) {
    
        }
    
        @Override
        public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, int relativeRowIndex, boolean isHead) {
    
            // 这里可以对cell进行任何操作
            LOGGER.info("第{}行,第{}列写入完成。", cell.getRowIndex(), cell.getColumnIndex());
    //        if (!isHead && cell.getStringCellValue().contains("个")) {
            if (!isHead && cell.getColumnIndex() == 1 && cell.getStringCellValue().contains("个")) {
                Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
                CellStyle cellStyle = workbook.createCellStyle();
                Font cellFont = workbook.createFont();
                cellFont.setBold(true);
                cellStyle.setFont(cellFont);
                cell.setCellStyle(cellStyle);
            }
    
    
        }

    自定义拦截器,实现对单元格样式设置核心如下

    用过 POI的应该都对 Workbook 这个不陌生了,其实 EasyExcel中也是集成了很多POI的接口的

    本来想的是用 EasyExcel 中的  WriteFont contentWriteFont = new WriteFont(); 

    但这块里面却没有我想要的 对单元格字体加粗的实现方法,

    最后突然转念一想,拦截器方法中我们能拿到Workbook 难道还不能自定义单元格字体等格式吗?显然不是的

    对比结合着之前POI使用经验,很快想到我们可以这样。

    Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
    CellStyle cellStyle = workbook.createCellStyle();
    Font cellFont = workbook.createFont();

     当然我这个是比较简单的一个案例,只实现了某些特定列,(单元格内容 中包含 “个”单元格进行加粗)

    其他的样式及控制条件,大家可以自定义

    接下来就是把 自定义样式的拦截器在导出Excel这块添加到 registerWriteHandler()中,这样就可以实现自定义单元格样式了

  • 相关阅读:
    gThumb 3.1.2 发布,支持 WebP 图像
    航空例行天气预报解析 metaf2xml
    Baruwa 1.1.2 发布,邮件监控系统
    Bisect 1.3 发布,Caml 代码覆盖测试
    MoonScript 0.2.2 发布,基于 Lua 的脚本语言
    Varnish 入门
    快速增量备份程序 DeltaCopy
    恢复模糊的图像 SmartDeblur
    Cairo 1.12.8 发布,向量图形会图库
    iText 5.3.4 发布,Java 的 PDF 开发包
  • 原文地址:https://www.cnblogs.com/Hizy/p/11825886.html
Copyright © 2011-2022 走看看