在日常工作中,excel 是一个不可或缺的工具,尤其是在处理大量数据时。为了提升数据的可读性和美观性,我们经常需要对 excel 中的单元格进行合并操作。本文将介绍如何使用 apache poi 库在 java 中实现 excel 单元格的合并,并提供一个现成的工具类供大家使用。
工具类介绍
我们提供了一个名为 excelmergeutility 的工具类,它可以帮助你轻松地合并 excel 中的单元格。该类支持纵向合并(按行合并)和横向合并(按列合并),并且可以指定需要合并的列。
工具类代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.cellrangeaddress;
import org.springframework.stereotype.component;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.util.list;
@component
public class excelmergeutility {
/**
* 合并excel中内容相同的单元格
*
* @param workbook 工作簿
* @param sheetname 工作表名称
* @param columnstomerge 需要合并的列索引列表
* @param isrowmerge 是否按行合并(纵向合并)
* @param iscolumnmerge 是否按列合并(横向合并)
*/
public void mergecells(workbook workbook, string sheetname, list<integer> columnstomerge,
boolean isrowmerge, boolean iscolumnmerge) {
sheet sheet = workbook.getsheet(sheetname);
if (sheet == null) {
throw new illegalargumentexception("工作表 " + sheetname + " 不存在");
}
// 记录第一列的合并行数
int firstcolmergeendrow = 0;
for (int colindex : columnstomerge) {
for (int rowindex = 0; rowindex <= sheet.getlastrownum(); rowindex++) {
row currentrow = sheet.getrow(rowindex);
if (currentrow == null) continue;
cell currentcell = currentrow.getcell(colindex);
if (currentcell == null) continue;
string currentvalue = currentcell.getstringcellvalue();
if (isrowmerge) {
// 纵向合并
int mergestartrow = rowindex;
while (rowindex + 1 <= sheet.getlastrownum()) {
row nextrow = sheet.getrow(rowindex + 1);
if (nextrow == null) break;
cell nextcell = nextrow.getcell(colindex);
if (nextcell == null || !nextcell.getstringcellvalue().equals(currentvalue)) break;
// 如果当前列不是第一列,且合并行数超过前一列的合并行数,则停止合并
if (colindex > 0 && rowindex + 1 > getmergeendrow(sheet, mergestartrow, colindex - 1)) break;
// 如果合并行数超过第一列的合并行数,则停止合并
if (colindex > 0 && rowindex + 1 > firstcolmergeendrow) break;
rowindex++;
}
if (mergestartrow != rowindex) {
sheet.addmergedregion(new cellrangeaddress(mergestartrow, rowindex, colindex, colindex));
}
// 如果是第一列,记录合并的最后一行
if (colindex == 0) {
firstcolmergeendrow = rowindex;
}
}
if (iscolumnmerge) {
// 横向合并
int mergestartcol = colindex;
while (colindex + 1 < currentrow.getlastcellnum()) {
cell nextcell = currentrow.getcell(colindex + 1);
if (nextcell == null || !nextcell.getstringcellvalue().equals(currentvalue)) break;
colindex++;
}
if (mergestartcol != colindex) {
sheet.addmergedregion(new cellrangeaddress(rowindex, rowindex, mergestartcol, colindex));
}
}
}
}
}
/**
* 获取指定单元格的合并的最后一行
*
* @param sheet 工作表
* @param rowindex 行索引
* @param colindex 列索引
* @return 合并的最后一行
*/
private int getmergeendrow(sheet sheet, int rowindex, int colindex) {
int nummergedregions = sheet.getnummergedregions();
for (int i = 0; i < nummergedregions; i++) {
cellrangeaddress mergedregion = sheet.getmergedregion(i);
if (mergedregion.isinrange(rowindex, colindex)) {
return mergedregion.getlastrow();
}
}
// for (cellrangeaddress mergedregion : sheet.getmergedregions()) {
// if (mergedregion.isinrange(rowindex, colindex)) {
// return mergedregion.getlastrow();
// }
// }
return rowindex; // 如果没有合并,则返回当前行
}
/**
* 示例:生成excel并合并单元格
*/
public void generateandmergeexcel(string filepath, string sheetname, list<integer> columnstomerge,
boolean isrowmerge, boolean iscolumnmerge) throws ioexception {
// 打开现有的excel文件
workbook workbook = workbookfactory.create(new fileinputstream(filepath));
// 合并单元格
mergecells(workbook, sheetname, columnstomerge, isrowmerge, iscolumnmerge);
// 写入文件
try (fileoutputstream fileout = new fileoutputstream(filepath)) {
workbook.write(fileout);
}
workbook.close();
}
}
调用示例
list<integer> columnstomerge = arrays.aslist(0, 1, 2, 3, 4, 5); // 合并第1列和第2列
boolean isrowmerge = true; // 启用纵向合并
boolean iscolumnmerge = false; // 禁用横向合并
excelmergeutility.generateandmergeexcel("c:\\users\\xxxx\\downloads\\汇总记录2025-03-04%2b10_38_30.xls", "汇总", columnstomerge, isrowmerge, iscolumnmerge);
依赖配置
为了使用这个工具类,你需要在你的项目中添加 apache poi 的依赖:
<!-- apache poi 核心库 -->
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi</artifactid>
<version>4.1.2</version>
</dependency>
<!-- apache poi ooxml 库,用于处理 .xlsx 文件 -->
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi-ooxml</artifactid>
<version>4.1.2</version>
</dependency>


总结
通过 excelmergeutility 工具类,你可以轻松地实现 excel 单元格的合并操作。无论是纵向合并还是横向合并,该工具类都能满足你的需求。
到此这篇关于使用apache poi在java中实现excel单元格的合并的文章就介绍到这了,更多相关apache poi合并excel单元格内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论