diff --git a/src/PhpSpreadsheet/Worksheet/Worksheet.php b/src/PhpSpreadsheet/Worksheet/Worksheet.php index e9e0d78c6..3703f0003 100644 --- a/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -2392,6 +2392,20 @@ class Worksheet if ($row < 1) { throw new Exception('Rows to be deleted should at least start from row 1.'); } + $startRow = $row; + $endRow = $startRow + $numberOfRows - 1; + $removeKeys = []; + foreach ($this->mergeCells as $key => $value) { + if (preg_match('/^[a-z]{1,3}(\d+)/i', $key, $matches) === 1) { + $startMergeInt = (int) $matches[1]; + if ($startMergeInt >= $startRow && $startMergeInt <= $endRow) { + $removeKeys[] = $key; + } + } + } + foreach ($removeKeys as $key) { + unset($this->mergeCells[$key]); + } $holdRowDimensions = $this->removeRowDimensions($row, $numberOfRows); $highestRow = $this->getHighestDataRow(); @@ -2448,6 +2462,20 @@ class Worksheet if (is_numeric($column)) { throw new Exception('Column references should not be numeric.'); } + $startColumnInt = Coordinate::columnIndexFromString($column); + $endColumnInt = $startColumnInt + $numberOfColumns - 1; + $removeKeys = []; + foreach ($this->mergeCells as $key => $value) { + if (preg_match('/^[a-z]{1,3}/i', $key, $matches) === 1) { + $startMergeInt = Coordinate::columnIndexFromString($matches[0]); + if ($startMergeInt >= $startColumnInt && $startMergeInt <= $endColumnInt) { + $removeKeys[] = $key; + } + } + } + foreach ($removeKeys as $key) { + unset($this->mergeCells[$key]); + } $highestColumn = $this->getHighestDataColumn(); $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn); diff --git a/tests/PhpSpreadsheetTests/Worksheet/MergeCellsDeletedTest.php b/tests/PhpSpreadsheetTests/Worksheet/MergeCellsDeletedTest.php new file mode 100644 index 000000000..731c03671 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Worksheet/MergeCellsDeletedTest.php @@ -0,0 +1,45 @@ +load($infile); + $sheet = $spreadsheet->getSheetByName('Sheet1'); + + $mergeCells = $sheet->getMergeCells(); + self::assertSame(['B1:F1', 'G1:I1'], array_values($mergeCells)); + + // Want to delete column B,C,D,E,F + $sheet->removeColumnByIndex(2, 5); + $mergeCells2 = $sheet->getMergeCells(); + self::assertSame(['B1:D1'], array_values($mergeCells2)); + $spreadsheet->disconnectWorksheets(); + } + + public function testDeletedRows(): void + { + $infile = 'tests/data/Reader/XLSX/issue.282.xlsx'; + $reader = new XlsxReader(); + $spreadsheet = $reader->load($infile); + $sheet = $spreadsheet->getSheetByName('Sheet2'); + + $mergeCells = $sheet->getMergeCells(); + self::assertSame(['A2:A6', 'A7:A9'], array_values($mergeCells)); + + // Want to delete rows 2 to 4 + $sheet->removeRow(2, 3); + $mergeCells2 = $sheet->getMergeCells(); + self::assertSame(['A4:A6'], array_values($mergeCells2)); + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.282.xlsx b/tests/data/Reader/XLSX/issue.282.xlsx new file mode 100644 index 000000000..95751ba13 Binary files /dev/null and b/tests/data/Reader/XLSX/issue.282.xlsx differ