Commit e82f3990 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Meilleure gestion des RANGE

parent 35e6f23b
Loading
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -96,23 +96,38 @@ class Calc

    public static function cellNameToCoords(string $name): array
    {
        $coords = [
            'absRow' => false,
            'absCol' => false,
        ];
        
        $col = '';
        $row = '';

        for ($i = 0; $i < strlen($name); $i++) {
        $start = 0;
        if (str_starts_with($name, '$')){
            $start = 1;
            $coords['absCol'] = true;
        }

        for ($i = $start; $i < strlen($name); $i++) {
            $chr = substr($name, $i, 1);
            $num = ord($chr);
            if ($num > 64 && $num < 65 + 26) {
                $col .= $chr;
            } else {
                if ($chr == '$'){
                    $coords['absRow'] = true;
                }else {
                    $row .= $chr;
                }
            }
        }

        return [
            'col' => self::letterToNumber($col),
            'row' => (int)$row,
        ];
        $coords['col'] = self::letterToNumber($col);
        $coords['row'] = (int)$row;

        return $coords;
    }


+20 −6
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@

namespace Unicaen\OpenDocument\Calc;

use Unicaen\OpenDocument\Calc;

class Formule
{
    private string $formule;
@@ -210,10 +212,22 @@ class Formule

        if (false !== strpos($val, ':')) {
            $range = explode(':', $val);
            $begin = $range[0];
            $end   = substr($range[1], 1);

            $cBegin = Calc::cellNameToCoords($begin);
            $cEnd   = Calc::cellNameToCoords($end);

            $term = [
                'type'          => 'range',
                'begin' => $range[0],
                'end'   => substr($range[1], 1),
                'begin'         => $begin,
                'end'           => $end,
                'rowBegin'      => $cBegin['row'],
                'rowEnd'        => $cEnd['row'],
                'colBegin'      => $cBegin['col'],
                'colNamedBegin' => Calc::numberToLetter($cBegin['col']),
                'colEnd'        => $cEnd['col'],
                'colNamedEnd'   => Calc::numberToLetter($cEnd['col']),
            ];
        } else {
            $term = [