EasyExcel合并单元格(同列相同数据合并)

这篇具有很好参考价值的文章主要介绍了EasyExcel合并单元格(同列相同数据合并)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

easyexcel合并列,java

合并后效果如下:
easyexcel合并列,java
合并策略代码:

public class CustomMergeStrategy extends AbstractMergeStrategy {

	/**
	 * 分组,每几行合并一次
	 */
	private List<List<Integer>> mergeColDataGroupCountList;

	/**
	 * 目标合并列index
	 */
	private List<Integer> targetColumnIndex;
	/**
	 * 	需要开始合并单元格的首行index
 	 */
	private Integer rowIndex;

	/**
	 * 	mergeColDataList为待合并目标列的值
 	 */
	public CustomMergeStrategy(List<List<String>> mergeColDataList, List<Integer> targetColumnIndex) {
		this.mergeColDataGroupCountList = getGroupCountList(mergeColDataList);
		this.targetColumnIndex = targetColumnIndex;
	}


	@Override
	protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {

		if (null == rowIndex) {
			rowIndex = cell.getRowIndex();
		}
		// 仅从首行以及目标列的单元格开始合并,忽略其他
		if (cell.getRowIndex() == rowIndex && targetColumnIndex.contains(cell.getColumnIndex())) {
			//找到对应的需要合并的列
			AtomicInteger i = new AtomicInteger(0);
			Optional<Integer> first = targetColumnIndex.stream().filter(col -> {
				i.getAndIncrement();
				return col == cell.getColumnIndex();
			}).findFirst();
			mergeGroupColumn(sheet, first.get());
		}
	}

	private void mergeGroupColumn(Sheet sheet, Integer index) {
		int rowCount = rowIndex;
		for (Integer count : mergeColDataGroupCountList.get(index)) {
			if (count == 1) {
				rowCount += count;
				continue;
			}
			// 合并单元格
			CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCount, rowCount + count - 1,
					targetColumnIndex.get(index), targetColumnIndex.get(index));
			sheet.addMergedRegionUnsafe(cellRangeAddress);
			rowCount += count;
		}
	}

	/**
	 * 	该方法将目标列根据值是否相同连续可合并,存储可合并的行数
 	 */
	private List<List<Integer>> getGroupCountList(List<List<String>> exportDataList) {
		if (CollUtil.isEmpty(exportDataList)) {
			return new ArrayList<>();
		}
		List<List<Integer>> groupCountListList = new ArrayList<>();
		exportDataList.forEach(dataList->{
			List<Integer> groupCountList = new ArrayList<>();
			int count = 1;
			for (int i = 1; i < dataList.size(); i++) {
				if (dataList.get(i).equals(dataList.get(i - 1))) {
					count++;
				} else {
					groupCountList.add(count);
					count = 1;
				}
			}
			// 处理完最后一条后
			groupCountList.add(count);
			groupCountListList.add(groupCountList);
		});
		return groupCountListList;
	}
}

使用:

//序号列和运营公司列需要合并单元格
		List<List<String>> mergeColDataList = Stream.of(data.stream().map(BridgeTypeLengthExcel::getNum).collect(Collectors.toList()),
				data.stream().map(BridgeTypeLengthExcel::getOperateDeptName).collect(Collectors.toList())).collect(Collectors.toList());
		//第一列(index=0)和第二列(index=1)
		List<Integer> mergeColIndexList = Stream.of(0, 1).collect(Collectors.toList());
		//内部finish的时候会自动关闭流
		EasyExcel.write(response.getOutputStream(), BridgeTypeLengthExcel.class)
				.registerWriteHandler(
						new CustomMergeStrategy(
								mergeColDataList, mergeColIndexList
						)
				)
				.sheet("统计")
				.doWrite(data);

主体代码来自网络,按自己业务修改,支持多列相同数据合并。文章来源地址https://www.toymoban.com/news/detail-517982.html

到了这里,关于EasyExcel合并单元格(同列相同数据合并)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录java使用EasyExcel进行单元格内换行操作

    1、首先是在需要换行的地方将 n   或者 rn 替换为 String.valueOf((char)10)  ,有时候不替换好像也能用 2、第一步完成后可能导出的内容还是无法换行,需要双击单元格才会换行, 在导出的java实体类上加入注解 @ContentStyle( horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignmen

    2023年04月08日
    浏览(42)
  • easyExcel 模版导出 中间数据纵向延伸,并且对指定列进行合并

    备注 : 模板注意 用{} 来表示你要用的变量 如果本来就有\\\"{\\\",\\\"}\\\" 特殊字符 用\\\"{\\\",\\\"}\\\"代替 // {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list 合并策略代码 : 导出部分 : 官方文档 :  填充Excel | Easy Excel 合并代码参考 :  https://www.cnblogs.com/monianxd/p/16359369.html

    2024年04月11日
    浏览(29)
  • java-EasyExcel导出excel设置单元格为文本格式(含代码)

    java-EasyExcel导出excel设置单元格为文本格式(含代码) 在使用EasyExcel导出excel模板时。我们会发现导出的日期和大长度数字都会自动更换格式,不是文本格式。并且在空白单元格输入日期也是格式有问题的,如下所示,可以看到当输入相同的日期时,格式会变成自适应,不是文

    2023年04月15日
    浏览(45)
  • vue element ui 表格有相同数据合并单元格

    先看效果     前提是你的数据是扁平的数据因为要根据上下数据是否一样才合并的  如果是子级数据需要改一下数据格式了 下面是数据的样式    合并单元格的重点属性就是 :summary-method=\\\"\\\" 这个是关键 完整代码

    2024年02月11日
    浏览(52)
  • Java 使用 EasyExcel 爬取数据

    分析要爬取数据的来源 1. 查找数据来源: 浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息: 复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件:FeHelper(FeHelper - Awesome) 4. 按 F12 打开控制台,查看网络请求

    2024年01月18日
    浏览(30)
  • JAVA(EasyExcel)通过远程调用模板 导出数据 复杂表头

    最近接手一个需求,单组数据的显示,也有多组数据的显示,查了好多文章,都不是很明白.但是这篇文章和我的需求差不多非常相似(链接放在文末),根据这篇文章然后将自己的实现过程记录了下来,以防之后再用到. 这是我需要导出的excel格式 开头是单条数据的展示 之后是多条数据

    2024年02月03日
    浏览(48)
  • EasyExcel导出Excel设置单元格文本格式(亲测有效)

    EasyExcel的maven依赖, 注意版本问题, 我的是3.0+的版本 下面是一开始的代码, 是不生效的, 查了好多都是这么设置的, 我也是这么写的但是就是不生效, 然后查了资料好多也说是注册写处理器必须是一个, 不能是多个, 因为我的是注册两个写处理器, 然后我就去掉了一个处理, 但是

    2024年02月16日
    浏览(48)
  • java List中相同的数据合并到一起

    运行结果 如果此篇文章有帮助到您, 希望打大佬们能 关注 、 点赞 、 收藏 、 评论 支持一波,非常感谢大家! 如果有不对的地方请指正!!! 参考1

    2024年02月12日
    浏览(45)
  • el-table 怎么合并相同单元格

    问题背景 项目需求table表格中,相同的类型合并成一个单元格展示。 问题描述 el-table 并没有相关的语法直接合并,需要我们自己传入一个方法返回一个数组格式,来确定要合并行列。 解决问题 首先需要在 el-table 标签上绑定 :span-method=\\\"objectSpanMethod\\\" 再去 methods 中定义 object

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包