excel 如何使用POI删除合并区域?

jtw3ybtb  于 2022-11-26  发布在  其他
关注(0)|答案(3)|浏览(585)

我知道我们可以使用sheet.addMergedRegion(range)合并单元格。我想知道如何删除合并。
1.我们是否可以使用sheet.removeMergedRegion(int)
1.如果是,那么请告诉我应该是什么论点
1.合并单元格中的数据将发生什么变化。

o8x7eapl

o8x7eapl1#

快速回答

1.是的
1.工作表中合并区域的ID
1.数据保留在区域的第一个单元格中,其他单元格将为空

说明

可以使用sheet.getMergedRegion(i)获取合并区域,其中i是其在工作表中的标识符。

/* ... initialize your workbook and sheet here ... */

// Loop through every merged region in the sheet
for(int i=0; i < sheet.getNumMergedRegions(); ++i)
{
    // Delete the region
    sheet.removeMergedRegion(i);
}

执行此操作时,合并区域的内容将保留在该区域的第一个单元格(左上角的单元格)中。其他单元格的内容将为空。

**示例:**如果您已将(A1与A2)与内容“合并区域”合并,则拆分得结果将是(A2)为空,(A1)为内容“合并区域.”

请注意,这是数据在内部的储存方式,即使您尝试取得合并区域中所包含储存格的值时也是如此。保持相同的范例,您将有:

CellReference ref = new CellReference("A1");
Row row = sheet.getRow( ref.getRow() );
Cell cell = row.getCell( ref.getCol() );
System.out.println( new DataFormatter().formatCellValue(cell) ); // Will print "merged region"

ref = new CellReference("A2");
row = sheet.getRow( ref.getRow() );
cell = row.getCell( ref.getCol() );
System.out.println( new DataFormatter().formatCellValue(cell) ); // Will print empty string

这在移除合并区域之前和之后的行为相同。

更多信息

如果您想要分割特定的合并区域,就必须在循环中加入条件来识别它:

// If we want to split the merged cell starting at D3
CellReference ref = new CellReference("D3");

for(int i=0; i < sheet.getNumMergedRegions(); ++i)
{
    CellRangeAddress range = sheet.getMergedRegion(i);

    if ( range.getFirstRow() == ref.getRow() && range.getLastRow() == ref.getCol() )
    {
        sheet.removeMergedRegion(i);
    }
}
doinxwow

doinxwow2#

我使用poi-3.12,从0到numberOfRegions的计数器对我不起作用,但从sheet.getNumMergedRegions()到0的另一个方向起作用。
若要移除区域并复制值,此操作适用于我:

for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
            CellRangeAddress region = sheet.getMergedRegion(i);
            Row firstRow = sheet.getRow(region.getFirstRow());
            Cell firstCellOfFirstRow = firstRow.getCell(region.getFirstColumn());

            if (firstCellOfFirstRow.getCellType() == Cell.CELL_TYPE_STRING) {
                value = firstCellOfFirstRow.getStringCellValue();
            }

            sheet.removeMergedRegion(i);

            for (Row row : sheet) {
                for (Cell cell : row) {
                    if (region.isInRange(cell.getRowIndex(), cell.getColumnIndex())) {
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        cell.setCellValue(value);
                    }
                }
            }

        }
4si2a6ki

4si2a6ki3#

我一直在寻找选项很长一段时间。这是我的工作。这将删除工作表上的所有区域。

while (sheet.getNumMergedRegions() > 0) {
        sheet.removeMergedRegion(0);
    }

相关问题