code: protected void handleCellSpanning() {
          RtfCell deletedCell = new RtfCell(true);
          for(int i = 0; i < this.cells.size(); i++) {
              RtfCell rtfCell = (RtfCell) this.cells.get(i);
              if(rtfCell.getColspan() > 1) {
                  int cSpan = rtfCell.getColspan();
                  for(int j = i + 1; j < i + cSpan; j++) {
                      if(j < this.cells.size()) {
                          RtfCell rtfCellMerge = (RtfCell) this.cells.get(j);
                          rtfCell.setCellRight(rtfCell.getCellRight() + rtfCellMerge.getCellWidth());
                          rtfCell.setCellWidth(rtfCell.getCellWidth() + rtfCellMerge.getCellWidth());
                          this.cells.set(j, deletedCell);
                      }
                  }
              }
              if(rtfCell.getRowspan() > 1) {
                  ArrayList rows = this.parentTable.getRows();
                  for(int j = 1; j < rtfCell.getRowspan(); j++) {
                      RtfRow mergeRow = (RtfRow) rows.get(this.rowNumber + j);
                      if(this.rowNumber + j < rows.size()) {
                          RtfCell rtfCellMerge = (RtfCell) mergeRow.getCells().get(i);
                          rtfCellMerge.setCellMergeChild(rtfCell);
                      }
                      if(rtfCell.getColspan() > 1) {
                          int cSpan = rtfCell.getColspan();
                          for(int k = i + 1; k < i + cSpan; k++) {
                              if(k < mergeRow.getCells().size()) {
                                  mergeRow.getCells().set(k, deletedCell);
                              }
                          }
                      }
                  }
              }
          }
      }
docs: Performs a second pass over all cells to handle cell row/column spanning.