Files
oleibman 5e02e282c7 Better Handling of Print Area After Column/Row Removal
Fix #2912, another oldie (3+ years). Removal of rows or columns which include part of the print area is not recalculating the print area correctly. This PR will correct that problem, but only if the print area consists of a single range. I think that is by far the most common use case. If there is a demonstrated need to handle multiple ranges, I will respond to a new issue.
2025-08-24 09:05:12 -07:00

101 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
class PrintAreaTest extends TestCase
{
#[DataProvider('removeRowsProvider')]
public function testRemoveRows(string $expected, int $rowNumber, int $numberOfRows): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getPageSetup()->setPrintArea('B5:M41');
$sheet->removeRow($rowNumber, $numberOfRows);
self::assertSame($expected, $sheet->getPageSetup()->getPrintArea());
$spreadsheet->disconnectWorksheets();
}
public static function removeRowsProvider(): array
{
return [
'before beginning of printArea' => ['B3:M39', 3, 2],
'creep into printArea' => ['B3:M37', 3, 4],
'entirely within printArea' => ['B5:M36', 6, 5],
'creep past end of printArea' => ['B5:M34', 35, 8],
'after end of printArea' => ['B5:M41', 55, 8],
'entire printArea' => ['', 5, 37],
'entire printArea+' => ['', 4, 47],
];
}
#[DataProvider('removeColumnsProvider')]
public function testRemoveColumns(string $expected, string $column, int $numberOfColumns): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getPageSetup()->setPrintArea('D5:M41');
$sheet->removeColumn($column, $numberOfColumns);
self::assertSame($expected, $sheet->getPageSetup()->getPrintArea());
$spreadsheet->disconnectWorksheets();
}
public static function removeColumnsProvider(): array
{
return [
'before beginning of printArea' => ['B5:K41', 'B', 2],
'creep into printArea' => ['B5:I41', 'B', 4],
'entirely within printArea' => ['D5:I41', 'E', 4],
'creep past end of printArea' => ['D5:K41', 'L', 3],
'after end of printArea' => ['D5:M41', 'P', 8],
'entire printArea' => ['', 'D', 10],
'entire printArea+' => ['', 'C', 15],
];
}
#[DataProvider('addRowsProvider')]
public function testAddRows(string $expected, int $rowNumber, int $numberOfRows): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getPageSetup()->setPrintArea('D5:M41');
$sheet->insertNewRowBefore($rowNumber, $numberOfRows);
self::assertSame($expected, $sheet->getPageSetup()->getPrintArea());
$spreadsheet->disconnectWorksheets();
}
public static function addRowsProvider(): array
{
return [
'entirely within printArea' => ['D5:M44', 15, 3],
'above printArea' => ['D9:M45', 3, 4],
'below printArea' => ['D5:M41', 48, 4],
];
}
#[DataProvider('addColumnsProvider')]
public function testAddColumns(string $expected, string $column, int $numberOfColumns): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getPageSetup()->setPrintArea('D5:M41');
$sheet->insertNewColumnBefore($column, $numberOfColumns);
self::assertSame($expected, $sheet->getPageSetup()->getPrintArea());
$spreadsheet->disconnectWorksheets();
}
public static function addColumnsProvider(): array
{
return [
'entirely within printArea' => ['D5:P41', 'J', 3],
'left of printArea' => ['H5:Q41', 'C', 4],
'right of printArea' => ['D5:M41', 'Q', 4],
];
}
}