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 填写模板指定行合并单元格相关推荐

  1. EasyExcel导出数据多行合并单元格

    文章目录 前言 一.话不多说上代码 2.导出使用 3.导出效果如下 总结 前言 记录使用EasyExcel导出Excel合并多行数据 一.话不多说上代码 代码如下:这是比较初始版本的.没做优化,如有大 ...

  2. easypoi 模板导出兼容合并单元格功能

    最新在使用easypoi,使用注解导出和模板导出的方式,现在主要就模板导出合并单元格一些坑和解决方法. 首先我建议刚接触的同学看这篇文章,很详细,功能也比较全面,比较感谢这篇文章的原创作者,网站1:e ...

  3. 动态处理表格多行合并单元格、同时解决hover错乱问题 - Vue Element Table

    简介: el-table单元格合并,处理hover错乱问题,自定义底部合计栏. 如图所示: 源码(复制另存txt,修改.html直接运行) <!DOCTYPE html> <html ...

  4. EasyExcel——多sheet、有合并单元格的excel导入

    EasyExcel--读Excel官方文档链接 maven依赖: <dependency><groupId>com.alibaba</groupId><art ...

  5. cxgrid 行合并单元格_【Excel VBA】如何批量撤销合并单元格?

    周末好,之前我们分享了批量合并单元格的VBA小代码,链接参考: [Excel VBA]如何批量合并相同值单元格? 天下大势合久必分.分久必合.分分合合合合分分又合合合再分分分又又合合合合合合合---- ...

  6. cxgrid 行合并单元格_合并单元格求和、计数、加序号

    合并单元格求和 同时选中D2:D13单元格区域,编辑栏输入公式后按Ctrl+回车: =SUM(C2:C13)-SUM(D3:D13) 有两个地方需要注意,一是输入公式后,要按Ctrl+回车. 二是注意 ...

  7. el-table合计行合并单元格并将数字小写转大写

    <el-table:data="billDetailsData"bordershow-summaryid="gy-table":summary-metho ...

  8. php excel行合并单元格

    Yii::$enableIncludePath = false; $objPHPExcel = new PHPExcel(); //设置标题样式加粗跟居中 $objPHPExcel->getAc ...

  9. EasyExcel 实现批量合并单元格(支持自定义)

    目录 1 Maven配置文件 2 MergeCellModel 3 CustomMergeCellHandler 4 调试代码 5 调试结果 注: 1 Maven配置文件 <!--hutool工 ...

最新文章

  1. 反爬虫——使用chrome headless时一些需要注意的细节
  2. 关于ASP.NET MVC 项目在本地vs运行响应时间过长无法访问时,解决方法!
  3. centos mysql 5.6.36_CentOS 6.9 升级MySQL 5.6.36到5.7.18
  4. The 'Microsoft Jet OLEDB 4.0 Provider' is not registered on the local machine
  5. jpa 默认生成sql语句_springboot-jpa自动创建数据库表
  6. java ie下载文件名乱码问题_php中强制下载文件的代码(解决了IE下中文文件名乱码问题)...
  7. 怎么看mysql的最大连接数_怎么查看和修改 MySQL 的最大连接数?
  8. request.params 用法
  9. java迷宫实训报告_Java综合实训报告-迷宫.doc
  10. python和java先学哪个-java和python先学哪个
  11. libevent 源码学习五 —— 事件 event
  12. 一份数据工程师必备的学习资源,干货满满(附链接)
  13. Power Query M语言概述
  14. Simulink Mutual Inductance互感线圈模块使用方法
  15. 英文地址翻译原则:先小后大。如**号**路**区,
  16. Cloudera Manager API使用(附代码)
  17. Window安装Redis并设置为开机启动
  18. vulnhub Pwned: 1
  19. ArcToolbox工具名英汉对应
  20. 五层体系结构特点及其功能

热门文章

  1. 怎么看电脑的hdmi是输出还是输入_笔记本HDMI不知道是只支持输出还是支持输入...
  2. 【中英双语】使用JavaScript 及Three.js开发3D网页游戏
  3. VS安装及其注意事项
  4. springboot毕设项目团队项目日程管理系统617qh(java+VUE+Mybatis+Maven+Mysql)
  5. 计算机强制关机后无法正常启动,由于强制关机导致计算机无法正常启动的系统解决方案...
  6. 艾灸除烟专用空气处理设备
  7. unity实现单个打字输入效果
  8. 我最喜欢的谚语[含程序方面]
  9. 盘点2018年度热词:区块链、5G通信热度反超人工智能
  10. TCL爱奇艺电视TV+怎么安装第三方软件