簡體   English   中英

如何使用 POI 刪除合並區域?

[英]How to remove Merged region using POI?

我知道我們可以使用 sheet.addMergedRegion(range) 合並單元格。 我想知道如何刪除合並。

  1. 我們可以使用 sheet.removeMergedRegion(int)
  2. 如果是,那么告訴我應該是什么論點
  3. 合並單元格中的數據會發生什么。

快速回答

  1. 工作表中合並區域的ID
  2. 數據保存在該區域的第一個單元格中,其他單元格將為空

說明

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

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

        }

我一直在尋找很長一段時間的選擇。 這是為我工作。 這將刪除工作表上的所有區域。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM