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

原文地址:https://www.cnblogs.com/Hizy/p/11825886.html

时间: 2024-08-01 16:33:22

EasyExcel使用及自定义设置单元格样式的相关文章

NPOI 生成Excel (单元格合并、设置单元格样式:字段,颜色、设置单元格为下拉框并限制输入值、设置单元格只能输入数字等)

NPIO源码地址:https://github.com/tonyqus/npoi NPIO使用参考:源码中的 NPOITest项目 下面代码包括: 1.包含多个Sheet的Excel 2.单元格合并 3.设置单元格样式:字段,颜色 4.设置单元格为下拉框并限制输入值 5.设置单元格只能输入数字 // // GET: /Excel/ public ActionResult Write() { var workbook = new HSSFWorkbook();//从流内容创建Workbook对象

用NPOI创建Excel、合并单元格、设置单元格样式、边框的方法

今天在做项目中,遇到使用代码生成具有一定样式的Excel,找了很多资料,最后终于解决了,Excel中格式的设置,以及单元格的合并等等.下面就介绍下,使用NPOI类库操作Excel的方法. 1.首先我们先在内存中生成一个Excel文件,代码如下:   HSSFWorkbook book = new HSSFWorkbook();        ISheet sheet = book.CreateSheet("Sheet1"); 2.然后在新创建的sheet里面,创建我们的行和列,代码如下

python xlwt 设置单元格样式

使用xlwt中的Alignment来设置单元格的对齐方式,其中horz代表水平对齐方式,vert代表垂直对齐方式. VERT_TOP = 0x00 上端对齐 VERT_CENTER = 0x01 居中对齐(垂直方向上) VERT_BOTTOM = 0x02 低端对齐 HORZ_LEFT = 0x01 左端对齐 HORZ_CENTER = 0x02 居中对齐(水平方向上) HORZ_RIGHT = 0x03 右端对齐 import xlwt def run(): wk = xlwt.Workboo

使用openpyxl创建excel并设置单元格样式

wb = Workbook() ws = wb.create_sheet('月度排名汇总', 0) # 合并单元格 ws.merge_cells('b2:b3') ws.merge_cells('c2:c3') ws.merge_cells('d2:d3') ws.merge_cells('e2:g2') ws.merge_cells('h2:j2') # 设置单元格文本内容 ws['b2'].value = '负责人' ws['c2'].value = '部门/小组' ws['d2'].val

【web开发】☆★之利用POI操作Excel表格系列教程【8】设置单元格对其方式

[web开发]☆★之利用POI操作Excel表格系列教程[8]设置单元格对其方式 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HS

[Xcode10 实际操作]五、使用表格-(8)自定义UITableView单元格Accessory样式(附件图标)

本文将演示如何自定义单元格的附件图标. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 3 //首先添加两个协议. 4 //一个是表格视图的代理协议UITableViewDelegate 5 //另一个是表格视图的数据源协议UITableViewDataSource 6 class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSou

【POI xlsx】使用POI对xlsx的单元格样式进行设置

涉及到的样式都在代码中有说明: 1 package com.it.poiTest; 2 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 import org.apache.poi.hssf.util.HSSFColor; 8 import org.apache.poi.sl.usermodel.Sheet; 9 import o

支持将数据导出到Excel文档的时候设置单元格格式的.NET控件Spire.DataExport

Spire.DataExport for .NET是e-iceblue公司推出的一款数据导出类.NET控件.作为一款专业的数据导出控件,Spire.DataExport for .NET可以帮助开发人员轻松快速的从各种主流数据库中导出数据并存储于各种文件格式中.他支持从SQL Command, DataTable,ListView中导出数据并存储于MS Excel,MS Word, HTML, XML, PDF, MS Access, DBF, SQL Script, SYLK, DIF, CS

127使用 TableView 自带的单元格样式实现好友列表,另外在单元格中添加辅助按钮

类似的做法如之前这篇随笔:114自定义 UITableViewCell 实现好友列表(扩展知识:如何使用xib创建自定义的表格视图单元格 KMTableViewCell) 相比之下:自定义 UITableViewCell 的内容灵活,可根据需求调整展示效果,应用场景更广:一般适用于TableView 自带的单元格样式无法实现的效果. 效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController :