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()中,这样就可以实现自定义单元格样式了

  • 相关阅读:
    SelectionKey理解
    redis3.0.3集群搭建
    Centos6.5环境下安装SVN 整合Apache+SSL
    没有注册类 。已加载,但找不到入口点 DllRegisterServer
    今日立秋
    35+开启忙而有序的日子
    jmeter的常用函数
    jmeter之java请求
    生成Webservice客户端的4种方法
    Pytest高级进阶之Fixture
  • 原文地址:https://www.cnblogs.com/Hizy/p/11825886.html
Copyright © 2011-2022 走看看