我们可以使用
sheet.addMergedRegion(rowFrom,rowTo,colFrom,colTo);
在工作表中添加合并单元格但我已经有一个包含合并单元格的工作表,我想取消合并这些单元格。
有没有办法在不使用 Apache POI 创建新工作表的情况下取消合并工作表的单元格?
将评论提升为答案...
你想要的方法是Sheet.removeMergedRegion(int)
这需要您添加区域时获得的区域索引。否则,您可以使用 getNumMergedRegions() 和 getMergedRegion(int) 迭代区域以查找要删除的区域的索引
我刚刚发现,在每个区域方法之后都会在内部检查现有区域的数量。例如。删除区域 1 后,所有内容都是新计算的,例如大小是 previousSize-1,并且sheet.getNumMergedRegions() 也少了 1。因此,对我来说,我将所有区域添加到列表中并将它们从工作表中删除。我总是使用 id 0,因为每次都会重新计算 id。
for(int i = 0; i<numOfRegion;i++)
{
regions.add(sheet.getMergedRegion(0));
sheet.removeMergedRegion(0);
}
由于某种原因,以下代码没有立即删除所有合并区域:
logger.info("Number of merged regions = " + sheet.getNumMergedRegions());
for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
logger.info("Removing merged region " + (i + 1));
sheet.removeMergedRegion(i);
}
logger.info("\nNumber of merged regions = " + sheet.getNumMergedRegions());
在控制台中我看到这个:
Number of merged regions = 7
Removing merged region 1
Removing merged region 2
Removing merged region 3
Removing merged region 4
Number of merged regions = 3
修复:
while (sheet.getNumMergedRegions() > 0) {
logger.info("Number of merged regions = " + sheet.getNumMergedRegions());
for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
logger.info("Removing merged region " + (i + 1));
sheet.removeMergedRegion(i);
}
}
我的问题是我的文档中已经合并了一些单元格。 因此,当我需要合并某个区域时,我必须取消合并该范围内的任何合并单元格。那个说指数重新计算的人救了我。
private CellRangeAddress mergeRange(Range range, XSSFSheet sheet) {
for (int i = 0; i < sheet.getMergedRegions().size(); i++) {
CellRangeAddress r = sheet.getMergedRegion(i);
int fRow = r.getFirstRow();
int lRow = r.getLastRow();
int fCol = r.getFirstColumn();
int lCol = r.getLastColumn();
if (fRow >= range.getFirstRow() && fRow <= range.getLastRow() &&
lRow >= range.getFirstRow() && lRow <= range.getLastRow() &&
fCol >= range.getFirstCol() && fCol <= range.getLastCol() &&
lCol >= range.getFirstCol() && lCol <= range.getLastCol()) {
sheet.removeMergedRegion(i);
i--;
}
}
return sheet.getMergedRegion(sheet.addMergedRegion(new CellRangeAddress(range.getFirstRow(), range.getLastRow(), range.getFirstCol(), range.getLastCol())));
}