Задать вопрос
@LikeSD
Системный администратор

Как в PHPWord заполнить таблицу циклом foreach?

Есть код:
public function actionPrint($id)
    {
        $model = Order::findOne($id);
        $orders = $model->products;
        $phpWord = new \PhpOffice\PhpWord\PhpWord();
        if(Yii::$app->request->isGet){
            if(Yii::$app->request->get('pdf') == 'bill'){
                $doc = new \PhpOffice\PhpWord\TemplateProcessor(Yii::getAlias('@webroot').'/files/print_temp/bills_temp.docx');
                $doc->setValue('d_date', date('d.m.Y'));
                $doc->setValue('c_inn', $model->client->inn);
                $doc->setValue('c_name', $model->client->name);

                foreach ($orders as $product){
                    $doc->setValues(array('p_name' => $product['description'], 'p_count' => $product['count'], 'p_price' => $product['price'], 'p_sum' => ($product['price'] * $product['count'])));
                }

                $str = 'num';
                $doc->cloneRow('num', count($orders));
                $dir = '/files/';
                $files_dir = Yii::getAlias('@webroot')."/".$dir;
                $file = str_replace("/","-", "Договор №".date("d-m-Y")).".docx";

                header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
                header('Content-Disposition: attachment;filename="invoice.docx"');
                header('Cache-Control: max-age=0');

                $doc->saveAs($files_dir.$file);
            }
        }

        return true;
    }


Все работает корректно, кроме заполнения данных. В шаблоне предусмотрена таблица вида:

636277381eb2c679193243.png

Я пробовал использовать цикл foreach для заполнения данных в связке с cloneRow, но ничего не получается. Выводится только первая запись массива и клонируется по количеству записей.

Пробовал использовать cloneRowAndSetValue, ситуация аналогичная cloneRow, только запись в этом случае выводится последняя и так же клонируется по количеству записей в массиве.

Вопрос: как корректно заполнять данные в шаблоне Word?
  • Вопрос задан
  • 386 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@LikeSD Автор вопроса
Системный администратор
Вопрос решил:

public function actionPrint($id)
    {
        $model = Order::findOne($id);
        $orders = $model->products;
        $phpWord = new \PhpOffice\PhpWord\PhpWord();
        if(Yii::$app->request->isGet){
            if(Yii::$app->request->get('pdf') == 'bill'){
                $doc = new \PhpOffice\PhpWord\TemplateProcessor(Yii::getAlias('@webroot').'/files/print_temp/bills_temp.docx');
                $doc->setValue('d_date', date('d.m.Y'));
                $doc->setValue('c_inn', $model->client->inn);
                $doc->setValue('c_name', $model->client->name);
                $str = 'num';
                $doc->cloneRow('num', count($orders));
                $i=0;
                foreach ($orders as $product){
                    $doc->setValue('num#'.$i, $i+1);
                    $doc->setValue('p_name#'.$i, $product['description']);
                    $doc->setValue('p_count#'.$i, $product['count']);
                    $doc->setValue('p_price#'.$i, $product['price']);
                    $doc->setValue('p_sum#'.$i, ($product['price'] * $product['count']));
                    $i++;
                }
                
                $dir = '/files/';
                $files_dir = Yii::getAlias('@webroot')."/".$dir;
                $file = str_replace("/","-", "Счет ".date("d-m-Y")).".docx";

                $doc->saveAs($files_dir.$file);
            }
        }

        return true;
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы