官网表格行循环: http://deepoove.com/poi-tl/#hack-loop-table

下面展示一些 内联代码片

创建类工具类:RowspanPolicy


import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import com.deepoove.poi.util.TableTools;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.poi.xwpf.usermodel.XWPFTable;import java.util.List;
import java.util.Map;/*** 根据,字段值判断是否合并单元格,* Results 泛型传入实体类,* 0 为第0列(列下标)* “type” 为字段名称* 使用方式如下* new RowspanPolicy<Results>(0, "type")* <p>* 仅适需要于用实体类列表循环的表格* 循环单元格,改变字体颜色等,为完成*/
public class RowspanPolicy<T> extends HackLoopTableRenderPolicy {private int rowIndex;private String fieldName;public RowspanPolicy2(boolean onSameLine) {this("[", "]", onSameLine, 0, "");}public RowspanPolicy2(int rowIndex, String fieldName) {this("[", "]", false, rowIndex, fieldName);}public RowspanPolicy2(String prefix, String suffix) {this(prefix, suffix, false, 0, "");}public RowspanPolicy2(String prefix, String suffix, boolean onSameLine, int rowIndex, String fieldName) {super(prefix, suffix, onSameLine);this.rowIndex = rowIndex;this.fieldName = fieldName;}protected void afterloop(XWPFTable table, Object data) {if (null == data) return;if (null == fieldName || "".equals(fieldName)) return;List<T> list = (List<T>) data;String curr = null;int count = 0;//重复数量for (int i = 0; i < list.size(); i++) {String str = getFieldValue(list.get(i), fieldName);if (curr == null) {curr = str;count = 1;} else if (curr.equals(str)) {++count;} else {mergeCellsVertically(table, rowIndex, i, count);curr = str;count = 1;}}mergeCellsVertically(table, rowIndex, list, count);}/*** 合并行** @param rowIndex 列* @param index    重复行下标* @param count    重复数量*/static void mergeCellsVertically(XWPFTable table, int rowIndex, int index, int count) {if (count > 1) TableTools.mergeCellsVertically(table, rowIndex, index - count + 1, index);}static <T> void mergeCellsVertically(XWPFTable table, int rowIndex, List<T> list, int count) {if (count > 1) TableTools.mergeCellsVertically(table, rowIndex, list.size() - count + 1, list.size());}/*** 获取值,判断是重复** @param target    数据源* @param fieldName 字段名* @return 值*/public String getFieldValue(Object target, String fieldName) {try {if (target instanceof Map) {return ((Map<?, ?>) target).get(fieldName).toString();}Object HSSFCell = FieldUtils.readField(target, fieldName, true);if (HSSFCell instanceof String) {return (String) HSSFCell;}TextRenderData textRenderData = (TextRenderData) HSSFCell;return textRenderData.getText();} catch (IllegalAccessException e) {throw new RuntimeException("字段类型不匹配,请检查字段类型和实体类是否一致");}}
}

应用示例

     //第1列,0为下标需要-1//字段名为name//TableData: 实体类名称,如果使用的是map 传入mapRowspanPolicy<TableData> rowspanPolicy = new RowspanPolicy<>(0, "name");RowspanPolicy<Map> rowspanPolicy = new RowspanPolicy<>(0, "name");Configure.builder().bind("tableData", rowspanPolicy).build();

实现思路:

1.基础原来的循环组件,在循环结束的地方重写 afterloop 方法
2.通过循环判断当前字段是否于上一个字段内容一致,
3.发现不一致的就合并上一组数据,结束时合并未循环的数据

注意

数据合并之前要先按照要合并的列排序
只能合并相邻并且内容一致的数据

poi-tl 循环表格合并重复项相关推荐

  1. wps的高亮怎么用_WPS表格高亮显示重复项功能的使用及其不足介绍与改进

    WPS表格高亮显示重复项功能的使用及其不足介绍与改进 时间:2014-08-11   作者:snow   来源:互联网 高亮显示重复项,这个功能还是不错的,顾名思义一下,就知道它的意思了.用法很简单, ...

  2. WPS 2013表格中重复项功能

    千盼万盼,WPS 2013终于出来了,Office办公助手也是在第一时间进行了下载安装,体验了一把.界面不错,图标也重新做了. 本站也发布了一系列的WPS 2013测评,而本文呢,主要是介绍WPS 2 ...

  3. WPS表格的重复项使用方法

    重复项就是指一列内容中有重复一样的值,或者两列数据对比后是否有重复的值,而在WPS表格中提供了直接标记重复值(高度重复项),删除重复值和限制重复值在一个单元格区域中输入. [WPS表格的高度重复项] ...

  4. 使用POI创建word表格合并单元格兼容wps

    poi创建word表格合并单元格代码如下: /** * @Description: 跨列合并 */ public void mergeCellsHorizontal(XWPFTable table, ...

  5. Excel:表格中重复项的处理

    1.标注重复项(行) (1)选定表格或区域 (2)开始选项卡/样式/条件格式/突出显示单元格规则/重复值 提示:选定区域中的所有重复项都会被标识出来. (3)如果要找到完全重复的一行,可在第一行行尾单 ...

  6. WPS如何合并重复项

    如下图,是某公司员工信息表,A列内容含有部分重复项,现在想要将这些重复项合并 选中A列数据单元格区域 点击下图选项(Excel工具箱,百度即可了解详细的下载安装方法,本文这里就不做具体解说演示) 点击 ...

  7. 表格中重复项设置一级和二级序号排序

    摘要: 一级分类存在重复项,需要排序,二级分类也存在重复项,也需要排序,相同一级分类中的二级分类需要重新从一开始排序(重点和难点) 先来看看效果: 公式: 公式一:获取大类序号 =MAX($A$2:A ...

  8. php如何合并重复项,php合并数组并去除重复

    php合并数组并去除重复的实现方法:1.使用"array_merge"方法或者"+"符号实现合并数组:2.通过"array_unique"函 ...

  9. 【WPS表格】数据有效性、横竖排互换、删除重复项等

    目录 数据有效性 录入的数据还未进行分类:若要将其分类为名单,手机号码,性别 横竖排转置 一次删除表格内的所有空行 文字按首字母排序 筛选大于90的单元格 筛选已经用不同颜色标志不同类别的数据 删除重 ...

  10. java合并sheet行_java poi Excel循环合并行

    //Java poi 实现循环合并行,还是第一次遇到这种问题 //在网上查了很多资料,都不是自己想要的 //以下为自己研究后,写的一点东西,给大家分享,希望对大家能有思路上的启发,也希望大家能提出宝贵 ...

最新文章

  1. CI报Disallowed Key Characters的解决
  2. CPU方案简介 RK3308 - 智能音响
  3. 每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着
  4. windows系统和linux系统可以使用相同的js代码吗_使用Sboxr自动发现和利用DOM(客户端)XSS漏洞...
  5. 扎实的基础知识、高质量的代码
  6. 机器学习1.1--模型和代价函数
  7. java类读取properties里内容
  8. python mobilenetssd android_tensorflow+ssd_mobilenet实现目标检测的训练
  9. 对Tabular方法的总结
  10. 为什么计算机无法访问u盘,WIN10系统无法访问U盘怎么处理_win10电脑u盘无法访问拒绝访问如何解决-win7之家...
  11. python在煤矿的用途-息烽高校邦数据科学通识课【Python爬虫】答案
  12. android 裁剪屏幕中特定区域内的内容
  13. 程序设计学习(c++)(课堂学习2)
  14. PHP中?是什么意思,有什么用?
  15. 启蒙、亲情、乐趣、营养,“健康童乐园”全面支持乡村儿童成长
  16. 解决Sqoop导出数据报错Can‘t parse input data 和 NoSuchElementException
  17. 51NOD 1631 小鲨鱼在51nod小学 区间线段树
  18. Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包
  19. BM1684实战记录
  20. 三菱PLC手轮控制功能

热门文章

  1. 智慧地产-售楼中心 3D 沙盘可视化
  2. 自动化测试框架[Cypress测试实例凸显其优势]
  3. 局域网之间两台计算机同屏,spacedesk解决两台电脑同屏的问题
  4. 轻松掌握计算机视觉三维重建的几何基础:坐标系与关键矩阵(基础矩阵、本质矩阵、单应矩阵)
  5. 一年月份大小月口诀_《认识年月日》大小月记忆法知识点教学设计
  6. 让IPFS星际文件系统永久保存你的数据
  7. LeetCode.495 Teemo Attacking
  8. 项目管理练习1577628224
  9. oracle18c静默安装教程,CentOS7无图形化界面静默安装oracle18c
  10. Redundant Variable 多余变量