merge method

void merge(
  1. CellIndex start,
  2. CellIndex end, {
  3. CellValue? customValue,
})

Merges the cells starting from start to end.

If custom value is not defined then it will look for the very first available value in range start to end by searching row-wise from left to right.

Implementation

void merge(CellIndex start, CellIndex end, {CellValue? customValue}) {
  int startColumn = start.columnIndex,
      startRow = start.rowIndex,
      endColumn = end.columnIndex,
      endRow = end.rowIndex;

  _checkMaxColumn(startColumn);
  _checkMaxColumn(endColumn);
  _checkMaxRow(startRow);
  _checkMaxRow(endRow);

  if ((startColumn == endColumn && startRow == endRow) ||
      (startColumn < 0 || startRow < 0 || endColumn < 0 || endRow < 0) ||
      (_spannedItems.contains(
          getSpanCellId(startColumn, startRow, endColumn, endRow)))) {
    return;
  }

  List<int> gotPosition = _getSpanPosition(start, end);

  _excel._mergeChanges = true;

  startColumn = gotPosition[0];
  startRow = gotPosition[1];
  endColumn = gotPosition[2];
  endRow = gotPosition[3];

  // Update maxColumns maxRows
  _maxColumns = _maxColumns > endColumn ? _maxColumns : endColumn + 1;
  _maxRows = _maxRows > endRow ? _maxRows : endRow + 1;

  bool getValue = true;

  Data value = Data.newData(this, startRow, startColumn);
  if (customValue != null) {
    value._value = customValue;
    getValue = false;
  }

  for (int j = startRow; j <= endRow; j++) {
    for (int k = startColumn; k <= endColumn; k++) {
      if (_sheetData[j] != null) {
        if (getValue && _sheetData[j]![k]?.value != null) {
          value = _sheetData[j]![k]!;
          getValue = false;
        }
        _sheetData[j]!.remove(k);
      }
    }
  }

  if (_sheetData[startRow] != null) {
    _sheetData[startRow]![startColumn] = value;
  } else {
    _sheetData[startRow] = {startColumn: value};
  }

  String sp = getSpanCellId(startColumn, startRow, endColumn, endRow);

  if (!_spannedItems.contains(sp)) {
    _spannedItems.add(sp);
  }

  _Span s = _Span(
    rowSpanStart: startRow,
    columnSpanStart: startColumn,
    rowSpanEnd: endRow,
    columnSpanEnd: endColumn,
  );

  _spanList.add(s);
  _excel._mergeChangeLookup = sheetName;
}