easyExcel自动合并单元格

摘要:
importcom.alibaba.excel.write.handler.CellWriteHandler;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.util.CellRangeAddress;int[]mergeColumnIndex){this.mergeRowIndex=mergeRowIndex;

来源EasyExcel(根据条件动态合并单元格的重复数据)

package com.ustcinfo.fn.comp.complain.util;

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;

/**
 * 单元格合并
 *
 * @author Jamin
 * @date 2020/11/9 11:35
 */
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
	/**
	 * 合并字段的下标
	 */
	private int[] mergeColumnIndex;
	/**
	 * 合并几行
	 */
	private int mergeRowIndex;

	public ExcelFillCellMergeStrategy() {
	}

	public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {
		this.mergeRowIndex = mergeRowIndex;
		this.mergeColumnIndex = mergeColumnIndex;
	}

	@Override
	public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
	                             Head head, Integer integer, Integer integer1, Boolean aBoolean) {

	}

	@Override
	public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
	                            Head head, Integer integer, Boolean aBoolean) {

	}

	@Override
	public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
	                                   CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {

	}

	@Override
	public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
	                             List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
//当前行
		int curRowIndex = cell.getRowIndex();
		//当前列
		int curColIndex = cell.getColumnIndex();

		if (curRowIndex > mergeRowIndex) {
			for (int i = 0; i < mergeColumnIndex.length; i++) {
				if (curColIndex == mergeColumnIndex[i]) {
					mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
					break;
				}
			}
		}
	}

	private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
		//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并
		Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() :
				cell.getNumericCellValue();
		Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
		Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() :
				preCell.getNumericCellValue();
		// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
		//
		if (curData.equals(preData)) {
			Sheet sheet = writeSheetHolder.getSheet();
			List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
			boolean isMerged = false;
			for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
				CellRangeAddress cellRangeAddr = mergeRegions.get(i);
				// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
				if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
					sheet.removeMergedRegion(i);
					cellRangeAddr.setLastRow(curRowIndex);
					sheet.addMergedRegion(cellRangeAddr);
					isMerged = true;
				}
			}
			// 若上一个单元格未被合并,则新增合并单元
			if (!isMerged) {
				CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex,
						curColIndex);
				sheet.addMergedRegion(cellRangeAddress);
			}
		}
	}
}
//使用
.registerWriteHandler(new ExcelFillCellMergeStrategy([从第几行开始],[合并哪几列]))

免责声明:文章转载自《easyExcel自动合并单元格》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇go语言游戏服务端开发(一)——架构微信小程序通过background-image设置背景图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF如何获得ListView内各单元格控件

------------------首先不推荐这种模式ItemsSource 已经绑定了源. Items 集合的数量变化很随机, 每个单元格的控件取决於  默认的DataTemplate(设置 DisplayMemberBinding 时) 或者  CellTemplate 定义的控件, 或者  CellTemplateSelector 指定的 Templ...

Handsontable对单元格的操作

1.自动填充单元格数据 fillHandle:true/false    //当值为true时,允许拖动单元格右下角,将其值自动填充到选中的单元格 2.合并单元格 mergeCells:[{row:起始行数,cols:起始列数,rowspan:合并的行数,colspan:合并的列数},...] 3.初始化单元格或列的对齐方式 水平样式:htLeft,h...

【转】【NPOI】使用NPOI进行word的读写

一、简介 1、操作Word的类库: NPOI:V2.5.1 快速生成https://github.com/tonyqus/npoi NPOI百度云下载:https://pan.baidu.com/s/13wiYmZ2txCq79CR-kj9Cvg提取码: 5x1v DocX(属于Xceed Words for .NET的免费版本):V1.6.0https...

python-win32操作excel的一些特殊功能

一、代码 特殊操作包括(隐藏列,解锁工作表保护,插入批注,创建文本框,追加修改单元格内容) from openpyxl import load_workbook import win32com.client # 隐藏列 def hidden_column(path, column, sheet_name=0): ''' :param pa...

用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式

做过很多次导出excel了。都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法。。。 弄过好几次都没有解决,最近又要导出excel了,下决心一定要找到解决办法 自己在excel里测试过,较长的数字,都会自动变成科学计数法,除非我们把单元格格式设置成“文本型” 哈哈,似乎找到了思路:用po...

poi的各种单元格样式以及一些常用的配置

之前我做过一个poi到处excel数据的博客,但是,后面使用起来发现,导出的数据单元格样式都不对。 很多没有居中对齐,很多单元格的格式不对,还有就是单元格的大小不对,导致数据显示异常,虽然功能可以使用但不是很完美。 这里找到网上一个比较全面的简单设置。这么做一个记录,之后就是参考这个单元格的样式配置自己需要的格式。 官方给出的api太难了,还是看中文的吧。...