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

时间:2014-04-09 10:55:19

标签: java excel api

我知道我们可以使用sheet.addMergedRegion(range)合并单元格。我想知道如何删除合并。

  1. 我们可以使用sheet.removeMergedRegion(int)
  2. 如果是,那么告诉我该论点应该是什么
  3. 合并单元格中存在的数据会发生什么。

2 个答案:

答案 0 :(得分:5)

快速回答

  1. 工作表中合并区域的ID
  2. 数据保存在该区域的第一个单元格中,其他单元格将为空
  3. 解释

    您可以使用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);
        }
    }
    

答案 1 :(得分:3)

我使用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);
                    }
                }
            }

        }