Code Monkey home page Code Monkey logo

Comments (4)

alhimik1986 avatar alhimik1986 commented on September 2, 2024

Приветствую. К сожалению формулы, как и все статичные значения, не дублируются. Дублируются (растягиваются) только шаблонные переменные. То есть там, где нужно "растянуть" формулу, надо вставить так же шаблонную переменную, а в коде (в качестве значений шаблонной переменной) вставлять массив формул ['=A1+B1', '=A2+B2'].

from php-excel-templator.

chernogolov avatar chernogolov commented on September 2, 2024

Благодарю! Я сделал событие, которое добавляет шаблон [! !] для формул и статичных параметров. Но возникла проблема. Для того, чтобы получить количество добавляемых строк мне пришлось, добавить $params в функцию для AFTER_INSERT_PARAMS.

Сделал я это естественно в папке vendor - src/PhpExcelTemplator.php 88 строка.
Стало вот так: $events[self::AFTER_INSERT_PARAMS]($sheet, $templateVarsArr, $params);

Может быть есть другое решение?

Вот мой код, возможно он пригодится:

$events = [
            PhpExcelTemplator::AFTER_INSERT_PARAMS => function(Worksheet $sheet, array $templateVarsArr, array $params) 
        {
                foreach ($templateVarsArr as $rowKey => $row) {
                    foreach ($row as $colKey => $colContent) {

                        //проверяем наличие шаблона [! !] в ячейке
                        preg_match('~\[!(.*?)!\]~', $colContent, $output);
                        if (isset($output[1])) {
                            for ($i = 0; $i < count($params['[timemark]']->value); $i++) {

                                //получаем координаты ячейки
                                $colIndex = $colKey + 1;
                                $rowIndex = $rowKey + 1;
                                $coordinate = Coordinate::stringFromColumnIndex($colIndex) . ($rowIndex + $i);

                                //если работаем с формулой, необходимо увеличить индексы иначе просто копируем значение
                                if(strpos($output[1], '=') !== false)
                                {
                                    $pattern = "/". $rowIndex ."/i";
                                    $replacement = $rowIndex + $i;
                                    $string = preg_replace($pattern, $replacement, $output[1]);
                                    $sheet->getCell($coordinate)->setValue($string);
                                }
                                else
                                    $sheet->getCell($coordinate)->setValue($output[1]);
                            }
                        }
                    }
                }
            },
        ];

Вот как это выглядит в шаблоне
Screenshot_59
:

from php-excel-templator.

alhimik1986 avatar alhimik1986 commented on September 2, 2024

Ну нельзя же так просто взять и тупо увеличить на +1 всякое число, которое есть в ячейке, которое совпадает с $rowIndex. Есть же и относительные и абсолютные (ячейки, которые нельзя увеличивать), а может встретиться константа, которая может совпасть с $rowIndex.

Как мне кажется, автоматическое увеличение индекса ячеек в формулах - это большая задача, для которой нужно создавать целый класс (или несколько). И там нужно учитывать все нюансы, да и без багов не обойдётся. А баги в формулах (особенно редкие) - это, поверь, очень отвратительно, очень много ответственных данных могут быть в этих формулах. Поэтому такую ответственную задачу я лучше переложу на пользователя. Благо, что гибкость это позволяет сделать.

from php-excel-templator.

chernogolov avatar chernogolov commented on September 2, 2024

Согласен. Это очень сырое решение. Но другого я пока не нашел к сожалению. В моем частном случае это работает с горем пополам так как формулы в моем шаблоне идентичные. И не содержат ничего другого.

from php-excel-templator.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.