Files
votervue/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Biff5.php
T

72 lines
2.0 KiB
PHP
Raw Normal View History

2026-07-03 15:46:56 -04:00
<?php
namespace PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
class Biff5 extends Xls
{
/**
* Reads a cell range address in BIFF5 e.g. 'A2:B6' or 'A1'
* always fixed range
* section 2.5.14.
*/
public static function readBIFF5CellRangeAddressFixed(string $subData): string
{
// offset: 0; size: 2; index to first row
$fr = self::getUInt2d($subData, 0) + 1;
// offset: 2; size: 2; index to last row
$lr = self::getUInt2d($subData, 2) + 1;
// offset: 4; size: 1; index to first column
$fc = ord($subData[4]);
// offset: 5; size: 1; index to last column
$lc = ord($subData[5]);
// check values
if ($fr > $lr || $fc > $lc) {
throw new ReaderException('Not a cell range address');
}
// column index to letter
$fc = Coordinate::stringFromColumnIndex($fc + 1);
$lc = Coordinate::stringFromColumnIndex($lc + 1);
if ($fr == $lr && $fc == $lc) {
return "$fc$fr";
}
return "$fc$fr:$lc$lr";
}
/**
* Read BIFF5 cell range address list
* section 2.5.15.
*
* @return array{size: int, cellRangeAddresses: string[]}
*/
public static function readBIFF5CellRangeAddressList(string $subData): array
{
$cellRangeAddresses = [];
// offset: 0; size: 2; number of the following cell range addresses
$nm = self::getUInt2d($subData, 0);
$offset = 2;
// offset: 2; size: 6 * $nm; list of $nm (fixed) cell range addresses
for ($i = 0; $i < $nm; ++$i) {
$cellRangeAddresses[] = self::readBIFF5CellRangeAddressFixed(substr($subData, $offset, 6));
$offset += 6;
}
return [
'size' => 2 + 6 * $nm,
'cellRangeAddresses' => $cellRangeAddresses,
];
}
}