(c) Павел Беляев

При использовании статей с сайта добавляйте в копирайт © Блог Павла Беляева http://pavelb.ru

среда, 31 января 2018 г.

PHPExcel 1.8 - getAllBorders bug - не выделяются границы

В общем дело происходило вот так

$Sheet->getStyle('A5:E9')->getBorders()
->getAllBorders()
->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

Но я перенес свой проектик с php5.4 на 7.1 и у меня очень много ошибок начало вылазить, не долго думая, решил обновить PHPExcel 1.7.6 -> 1.8, после обновления, у меня перестали применяться стили к границам ячеек.

Ну я залез в файл PHPExcel/Style/Border.php
и на 141 строке нашел функцию getStyleArray

public function getStyleArray($array)
    {
        switch ($this->parentPropertyName) {
            case 'allBorders':
            case 'bottom':
            case 'diagonal':
            case 'horizontal':
            case 'inside':
            case 'left':
            case 'outline':
            case 'right':
            case 'top':
            case 'vertical':
                $key = strtolower('vertical');
                break;
        }
        return $this->parent->getStyleArray(array($key => $array));
    }


Смешно, да?
При любом положении bottom, diagonal... у нас будет vertical.

Теперь обратимся к более ранней версии этой функции (1.7.6)

public function getStyleArray($array)
    {
        switch ($this->_parentPropertyName) {
        case '_allBorders':
            $key = 'allborders';
            break;

        case '_bottom':
            $key = 'bottom';
            break;

        case '_diagonal':
            $key = 'diagonal';
            break;

        case '_horizontal':
            $key = 'horizontal';
            break;

        case '_inside':
            $key = 'inside';
            break;

        case '_left':
            $key = 'left';
            break;

        case '_outline':
            $key = 'outline';
            break;

        case '_right':
            $key = 'right';
            break;

        case '_top':
            $key = 'top';
            break;

        case '_vertical':
            $key = 'vertical';
            break;
        }
        return $this->_parent->getStyleArray(array($key => $array));
    }



Т.е. в старой версии к нам приходили значения с префиксом _, а на выходе без префикса, в новой версии библиотеки перепилили всё и входные стали без префикса, но разработчики немного были невнимательными и хотели сказать что-то вроде такого:
public function getStyleArray($array)
    {
        switch ($this->parentPropertyName) {
            case 'allBorders':
            case 'bottom':
            case 'diagonal':
            case 'horizontal':
            case 'inside':
            case 'left':
            case 'outline':
            case 'right':
            case 'top':
            case 'vertical':
                $key = strtolower(
$this->parentPropertyName);
                break;
        }
        return $this->parent->getStyleArray(array($key => $array));
    }




После этого всё заработало, ура!!! Сейчас попробуем отправить разработчикам патч, хоть проект и закопали, но кому-то он еще нужен, у кого-то используется и пусть он живет за счет тех, кто это вообще использует.

пятница, 12 января 2018 г.

Ошибка 0xC0370027 hyper-v не удалось восстановить



После очередных экспериментов, когда я сперва удалил службу Hyper-V, потом снова установил (хотел протестировать кое что без установленного гипервизора в системе).

Системы сохранились, но запускаться отказались, при попытке запуска выдает вот такую ошибку:


















Решается это следующим методом - в списке виртуальных машин выбираем нужную (с проблемами), а справа видим список действий для этой машины






















Ну и там второй снизу пункт "удалить сохраненное состояние", после этого всё запустится без проблем.