easyexcel 填写模板指定行合并单元格
1.easyexcel(官网)添加版本依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>
2.编写一个类继承合并单元策略,重写merge()方法
package com.lxj.exam.handler;import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import java.util.List;/*** 合并单元格处理类*/
public class MyHandler extends AbstractMergeStrategy {/*** 合并开始行*/private Integer startRow = 0;/*** list表格所有的合并列集合*/private List<CellRangeAddress> cellRangeAddressList = null;public MyHandler() {}public MyHandler(int startRow, List<CellRangeAddress> cellRangeAddressList) {this.startRow = startRow;this.cellRangeAddressList = cellRangeAddressList;}@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {// 设置样式CellStyle cellStyle = cell.getCellStyle();//水平居中cellStyle.setAlignment(HorizontalAlignment.CENTER);//自动换行cellStyle.setWrapText(true);//在这里判断从哪一行开始调用合并的方法if (cell.getRowIndex() > this.startRow) {if (relativeRowIndex == null || relativeRowIndex == 0) {return;}mergeColumn(sheet, cell, head, relativeRowIndex);}}/*** 合并单元格** @param sheet* @param cell* @param head* @param relativeRowIndex*/protected void mergeColumn(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {int rowIndex = cell.getRowIndex();int colIndex = cell.getColumnIndex();sheet = cell.getSheet();// 获取前一行Row preRow = sheet.getRow(rowIndex - 1);//获取前一列Cell preCell = preRow.getCell(colIndex);List<CellRangeAddress> list = this.cellRangeAddressList;for (int i = 0; i < list.size(); i++) {CellRangeAddress cellRangeAddress = list.get(i);if (cellRangeAddress.containsColumn(preCell.getColumnIndex())) {int lastColIndex = cellRangeAddress.getLastColumn();int firstColIndex = cellRangeAddress.getFirstColumn();CellRangeAddress cra = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex(), firstColIndex, lastColIndex);sheet.addMergedRegion(cra);// 加边框RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderTop(BorderStyle.THIN, cra, sheet);return;}}}}
3.测试方法
/**
*@param templateFilePath 模板文件路径
*@param filePath 导出文件路径
*/public static void test3(String templateFilePath, String filePath) {Map<String, List<ExcelDto>> map = new HashMap<>();map.put("a", getListDtos());Map<String, Object> testMap = new HashMap<>();testMap.put("date", LocalDateTime.now());testMap.put("title", "测试");// 添加合并单元格地址List<CellRangeAddress> list = new ArrayList<>();//new CellRangeAddress(开始行,结束行,开始列,结束列) list.add(new CellRangeAddress(1, 1, 2, 3));list.add(new CellRangeAddress(1, 1, 5, 6));// 创建ExcelWriterBuilder ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(filePath).withTemplate(templateFilePath);ExcelWriter excelWriter = excelWriterBuilder.build();// 创建writeSheet,并注册合并单元格handlerWriteSheet writeSheet = EasyExcel.writerSheet().registerWriteHandler(new MyHandler(0,list)).build();WriteSheet writeSheet1 = EasyExcel.writerSheet().build();// 填写配置,forceNewRow true表示自动创建一行,后面的数据后移FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();//填写数据excelWriter.fill(new FillWrapper("a", getListDtos()), fillConfig, writeSheet);excelWriter.fill(testMap,writeSheet1);// 关闭填写excelWriter.finish();}public static List<ExcelDto> getListDtos() {List<ExcelDto> list = new ArrayList<>();int i = 0;while (i < 1) {list.add(new ExcelDto("张三", 2, 2, "打工仔", "打工仔"));list.add(new ExcelDto("李四1", 2, 2, "打工仔", "打工仔"));list.add(new ExcelDto("李四2", 2, 2, "打工仔", "打工仔"));list.add(new ExcelDto("李四3", 2, 2, "打工仔", "打工仔"));list.add(new ExcelDto("李四4", 2, 2, "打工仔", "打工仔"));list.add(new ExcelDto("李四5", 2, 2, "打工仔", "打工仔"));i++;}return list;}
模板文件
导出的文件内容
注:有两个需要注意的地方是,1.代码里面用了forceNewRow为ture,在写excel模板的时候,
表达式需要合并的地方一定要合并。
没有合并,结果会像下面看到一样。
2.第二个要注意的地方是,这个两个填充数据的顺序一定是list数据在上,kay-value数据在下,否则导出来的数据没有合并。像下面的这样就是对的。
easyexcel 填写模板指定行合并单元格相关推荐
- EasyExcel导出数据多行合并单元格
文章目录 前言 一.话不多说上代码 2.导出使用 3.导出效果如下 总结 前言 记录使用EasyExcel导出Excel合并多行数据 一.话不多说上代码 代码如下:这是比较初始版本的.没做优化,如有大 ...
- easypoi 模板导出兼容合并单元格功能
最新在使用easypoi,使用注解导出和模板导出的方式,现在主要就模板导出合并单元格一些坑和解决方法. 首先我建议刚接触的同学看这篇文章,很详细,功能也比较全面,比较感谢这篇文章的原创作者,网站1:e ...
- 动态处理表格多行合并单元格、同时解决hover错乱问题 - Vue Element Table
简介: el-table单元格合并,处理hover错乱问题,自定义底部合计栏. 如图所示: 源码(复制另存txt,修改.html直接运行) <!DOCTYPE html> <html ...
- EasyExcel——多sheet、有合并单元格的excel导入
EasyExcel--读Excel官方文档链接 maven依赖: <dependency><groupId>com.alibaba</groupId><art ...
- cxgrid 行合并单元格_【Excel VBA】如何批量撤销合并单元格?
周末好,之前我们分享了批量合并单元格的VBA小代码,链接参考: [Excel VBA]如何批量合并相同值单元格? 天下大势合久必分.分久必合.分分合合合合分分又合合合再分分分又又合合合合合合合---- ...
- cxgrid 行合并单元格_合并单元格求和、计数、加序号
合并单元格求和 同时选中D2:D13单元格区域,编辑栏输入公式后按Ctrl+回车: =SUM(C2:C13)-SUM(D3:D13) 有两个地方需要注意,一是输入公式后,要按Ctrl+回车. 二是注意 ...
- el-table合计行合并单元格并将数字小写转大写
<el-table:data="billDetailsData"bordershow-summaryid="gy-table":summary-metho ...
- php excel行合并单元格
Yii::$enableIncludePath = false; $objPHPExcel = new PHPExcel(); //设置标题样式加粗跟居中 $objPHPExcel->getAc ...
- EasyExcel 实现批量合并单元格(支持自定义)
目录 1 Maven配置文件 2 MergeCellModel 3 CustomMergeCellHandler 4 调试代码 5 调试结果 注: 1 Maven配置文件 <!--hutool工 ...
最新文章
- 反爬虫——使用chrome headless时一些需要注意的细节
- 关于ASP.NET MVC 项目在本地vs运行响应时间过长无法访问时,解决方法!
- centos mysql 5.6.36_CentOS 6.9 升级MySQL 5.6.36到5.7.18
- The 'Microsoft Jet OLEDB 4.0 Provider' is not registered on the local machine
- jpa 默认生成sql语句_springboot-jpa自动创建数据库表
- java ie下载文件名乱码问题_php中强制下载文件的代码(解决了IE下中文文件名乱码问题)...
- 怎么看mysql的最大连接数_怎么查看和修改 MySQL 的最大连接数?
- request.params 用法
- java迷宫实训报告_Java综合实训报告-迷宫.doc
- python和java先学哪个-java和python先学哪个
- libevent 源码学习五 —— 事件 event
- 一份数据工程师必备的学习资源,干货满满(附链接)
- Power Query M语言概述
- Simulink Mutual Inductance互感线圈模块使用方法
- 英文地址翻译原则:先小后大。如**号**路**区,
- Cloudera Manager API使用(附代码)
- Window安装Redis并设置为开机启动
- vulnhub Pwned: 1
- ArcToolbox工具名英汉对应
- 五层体系结构特点及其功能
热门文章
- 怎么看电脑的hdmi是输出还是输入_笔记本HDMI不知道是只支持输出还是支持输入...
- 【中英双语】使用JavaScript 及Three.js开发3D网页游戏
- VS安装及其注意事项
- springboot毕设项目团队项目日程管理系统617qh(java+VUE+Mybatis+Maven+Mysql)
- 计算机强制关机后无法正常启动,由于强制关机导致计算机无法正常启动的系统解决方案...
- 艾灸除烟专用空气处理设备
- unity实现单个打字输入效果
- 我最喜欢的谚语[含程序方面]
- 盘点2018年度热词:区块链、5G通信热度反超人工智能
- TCL爱奇艺电视TV+怎么安装第三方软件