合并相同列的数据(引用)

/*
标题:合并相同列的数据
作者:爱新觉罗.毓华
时间:2008-05-05
地点:广东深圳
*/

/*情况说明
NAME USERID
张三 KB001
张三 KB003
李四 KB001
李四 KB002
李四 KB003

用SQL实现表示如下:
NAME USERID
张三 KB001,KB003
李四 KB001,KB002,KB003
*/

create table tb(NAME varchar2(10) , USERID varchar2(10))
insert into tb values('张三' , 'KB001');
insert into tb values('张三' , 'KB003');
insert into tb values('李四' , 'KB001');
insert into tb values('李四' , 'KB002');
insert into tb values('李四' , 'KB003');

--1
select name,rtrim(
 
max(decode(USERID , 'KB001' , USERID || ',' , '')) ||
 
max(decode(USERID , 'KB002' , USERID || ',' , '')) ||
 
max(decode(USERID , 'KB003' , USERID || ',' , '')),',') userid
from tb
group by name

--2
SELECT NAME, ltrim(MAX(sys_connect_by_path(userid , ',')) , ',') userid
FROM (SELECT NAME , userid , row_number() over(PARTITION BY NAME ORDER BY userid) rn , rownum prn FROM tb)
START
WITH rn = 1
CONNECT
BY prn - 1 = PRIOR prn AND NAME = PRIOR NAME
GROUP BY NAME
ORDER BY NAME;

drop table tb

/*
NAME       USERID                          
---------- ---------------------------------
李四       KB001,KB002,KB003               
张三       KB001,KB003                     
2 rows selected
*/

 

 

create table t2(col1 varchar2(10),col2 varchar2(10));
insert into t2 values('001','vl1');
insert into t2 values('001','vl2');
insert into t2 values('001','vl3');
insert into t2 values('002','vl1');
insert into t2 values('002','vl2');

SELECT COL1, LTRIM(MAX(SYS_CONNECT_BY_PATH(COL2, ',')), ',') COL2
FROM (SELECT COL1,
               COL2,
              
MIN(COL2) OVER(PARTITION BY COL1) COL2_MIN,
               (ROW_NUMBER()
OVER(ORDER BY COL1, COL2)) +
               (DENSE_RANK()
OVER(ORDER BY COL1)) NUMID
         
FROM T2)
START
WITH COL2 = COL2_MIN
CONNECT
BY NUMID - 1 = PRIOR NUMID
GROUP BY COL1

/*
COL1       COL2                                   
---------- ----------------------------------------
001        vl1,vl2,vl3                            
002        vl1,vl2                                
2 rows selected
*/

<think>嗯,用户想了解如何使用EasyExcel对相同数据进行合并操作,需要教程和示例代码。首先,我得回忆一下EasyExcel的文档和关功能。记得EasyExcel有单元格合并的功能,可能涉及到自定义合并策略。用户提到的合并应该是指将相同内容的单元格合并成一个,比如同一中连续相同的值合并。 然后,我需要确认如何实现这一点。根据之前的经验,EasyExcel允许通过注册自定义的单元格合并策略来实现。可能需要继承AbstractMergeStrategy类,并重写merge方法。在merge方法中,遍历每一行,比较当前单元格和上一个单元格的值,如果相同合并。 接下来要考虑示例代码的结构。首先,创建数据模型,可能是一个简单的实体类,比如有部门名称和组名的字段。然后,准备模板文件,模板中使用占位符,比如{deptName}和{groupName}。在写入数据时,注册自定义的合并策略。 需要注意的点是,合并策略需要正确判断相同值,并且处理多的情况。可能需要遍历所有需要合并,比如第0和第1。同时,要确保合并的起始行和结束行正确,比如从第二行开始(假设表头在第一行)。 另外,用户可能希望看到具体的代码示例,包括数据填充和合并策略的实现。还要提醒用户模板的占位符格式,比如使用{变量},如果是表则用{.变量}。同时,引用官方文档和已有的参考资料,确保信息的准确性。 最后,生成关问题,帮助用户进一步了解EasyExcel的其他功能,比如多sheet操作、性能优化等。确保回答结构清晰,分步骤说明,代码示例正确,并且引用提供的参考资料中的信息。</think>### EasyExcel合并相同数据操作指南 一、实现原理 EasyExcel通过`CellWriteHandler`接口实现单元格合并,需自定义合并策略类继承`AbstractMergeStrategy`。核心步骤包括: 1. 遍历数据行判断邻单元格内容 2. 记录相同值的起始行索引 3. 调用`merge`方法合并单元格区域[^1] 二、实现步骤 1. **创建合并策略类**: ```java public class SameDataMergeStrategy extends AbstractMergeStrategy { private final int[] mergeColumns; // 需要合并索引 public SameDataMergeStrategy(int... mergeColumns) { this.mergeColumns = mergeColumns; } @Override protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { if (cell.getRowIndex() > 1) { // 跳过表头行 for (int col : mergeColumns) { String current = cell.getSheet().getRow(cell.getRowIndex()).getCell(col).getStringCellValue(); String prev = cell.getSheet().getRow(cell.getRowIndex()-1).getCell(col).getStringCellValue(); if (current.equals(prev)) { CellRangeAddress range = new CellRangeAddress( cell.getRowIndex()-1, cell.getRowIndex(), col, col ); sheet.addMergedRegion(range); } } } } } ``` 2. **数据填充示例**: ```java // 准备数据 List<DeptData> dataList = Arrays.asList( new DeptData("研发部", "前端组"), new DeptData("研发部", "后端组"), new DeptData("测试部", "自动化组"), new DeptData("测试部", "功能组") ); // 执行填充 String template = "template.xlsx"; String output = "result.xlsx"; EasyExcel.write(output) .withTemplate(template) .registerWriteHandler(new SameDataMergeStrategy(0, 1)) // 合并第0和第1 .sheet() .doFill(dataList); ``` 三、注意事项 1. 模板中需使用`{.字段名}`格式标记合并区域 ```excel | 部门 | 小组 | | {.deptName} | {.groupName} | ``` 2. 合并策略应注册在`WriteHandler`链的最前端 3. 大数据量时建议分批次处理以避免内存溢出[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值