固定模板方式,首先创建要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()中,这样就可以实现自定义单元格样式了
原网址: 访问
创建于: 2021-08-25 10:16:35
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论