mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-03 22:19:19 +00:00
06fef872be
PR #455 was submitted by @Aketos in 2018. It added no unit tests, so it was not merged, and it eventually went stale. Without the tests, I'm not sure exactly what the user had in mind. But my investigation indicates the following: - for Xls files, if the column width in the file specifies a value greater than 255, Excel will choose its own width when it opens the file. - for Xlsx files: - Excel does not allow you to set a column width > 255, neither by dragging the column boundary, nor by right-clicking and setting a value, nor by auto-fitting the column width. - Nevertheless, if the XML specifies a column width > 255, Excel will honor that value in the displayed spreadsheet, and even write it out if the file is saved. I have taken a different approach than the original PR, which changed `Worksheet::calculateColumnWidths`. Instead, this PR adds an option to the Xlsx Writer to either restrict column widths to 255 or not. The default is "not" in order to avoid a breaking change. For emulating Excel's behavior, in the unusual situation where it might matter, the user might consider using the non-default option. This PR also restricts column dimension width to 255 when saving an Xls file.
81 lines
3.4 KiB
PHP
81 lines
3.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
|
|
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
|
|
|
class ColumnDimension3Test extends AbstractFunctional
|
|
{
|
|
public function testXlsxDefault(): void
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->getCell('B1')->setValue('hello');
|
|
$sheet->getCell('C1')->setValue(2);
|
|
$sheet->getCell('A1')->setValue('=REPT("ABCDEFGHIJKLMNOPQRS*",13)');
|
|
$sheet->getStyle('A1')->getFont()
|
|
->setSize(11)
|
|
->setName('Courier New');
|
|
$sheet->getColumnDimension('A')->setAutoSize(true);
|
|
$sheet->getColumnDimension('B')->setAutoSize(true);
|
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
|
$spreadsheet->disconnectWorksheets();
|
|
$sheet = $reloadedSpreadsheet->getActiveSheet();
|
|
self::assertGreaterThan(255.0, $sheet->getColumnDimension('A')->getWidth());
|
|
self::assertLessThan(255.0, $sheet->getColumnDimension('B')->getWidth());
|
|
self::assertSame(-1.0, $sheet->getColumnDimension('C')->getWidth());
|
|
$reloadedSpreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function testXlsxRestrict(): void
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->getCell('B1')->setValue('hello');
|
|
$sheet->getCell('C1')->setValue(2);
|
|
$sheet->getCell('A1')->setValue('=REPT("ABCDEFGHIJKLMNOPQRS*",13)');
|
|
$sheet->getStyle('A1')->getFont()
|
|
->setSize(11)
|
|
->setName('Courier New');
|
|
$sheet->getColumnDimension('A')->setAutoSize(true);
|
|
$sheet->getColumnDimension('B')->setAutoSize(true);
|
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', null, [self::class, 'restrictWidth']);
|
|
$spreadsheet->disconnectWorksheets();
|
|
$sheet = $reloadedSpreadsheet->getActiveSheet();
|
|
self::assertSame(255.0, $sheet->getColumnDimension('A')->getWidth());
|
|
self::assertLessThan(255.0, $sheet->getColumnDimension('B')->getWidth());
|
|
self::assertSame(-1.0, $sheet->getColumnDimension('C')->getWidth());
|
|
$reloadedSpreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function testXls(): void
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
$sheet->getCell('B1')->setValue('hello');
|
|
$sheet->getCell('C1')->setValue(2);
|
|
$sheet->getCell('A1')->setValue('=REPT("ABCDEFGHIJKLMNOPQRS*",13)');
|
|
$sheet->getStyle('A1')->getFont()
|
|
->setSize(11)
|
|
->setName('Courier New');
|
|
$sheet->getColumnDimension('A')->setAutoSize(true);
|
|
$sheet->getColumnDimension('B')->setAutoSize(true);
|
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xls');
|
|
$spreadsheet->disconnectWorksheets();
|
|
$sheet = $reloadedSpreadsheet->getActiveSheet();
|
|
self::assertSame(255.0, $sheet->getColumnDimension('A')->getWidth());
|
|
self::assertLessThan(255.0, $sheet->getColumnDimension('B')->getWidth());
|
|
self::assertLessThan(255.0, $sheet->getColumnDimension('C')->getWidth());
|
|
$reloadedSpreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public static function restrictWidth(XlsxWriter $writer): void
|
|
{
|
|
$writer->setRestrictMaxColumnWidth(true);
|
|
}
|
|
}
|