За последние 24 часа нас посетили 22583 программиста и 1141 робот. Сейчас ищут 800 программистов ...

как в phpword вставить в шаблон не простой текст, а целую таблицу, созданную в том же phpword?

Тема в разделе "PHP для профи", создана пользователем ProgFrog, 2 июн 2022.

Метки:
  1. ProgFrog

    ProgFrog Новичок

    С нами с:
    16 янв 2020
    Сообщения:
    9
    Симпатии:
    0
    у меня есть рабочий пример кода, где в phpword создаётся новый файл с таблицей
    Код (Text):
    1. require_once("vendor/autoload.php");
    2. /* Start to develop here. Best regards https://php-download.com/ */
    3. // Creating the new document...
    4. $phpWord = new \PhpOffice\PhpWord\PhpWord();
    5. // Adding an empty Section to the document...
    6. $section = $phpWord->addSection();
    7. // своя таблица
    8. $fancyTableStyle = array('borderColor' => 'gray', 'borderSize' => 1, 'cellMargin' => 80,'cellSpacing'=>1); // стили для таблицы
    9. $fancyTableFontStyle = array('size' => 10, 'bold' => true); // стили для заголовка таблицы (thead)
    10. $myFontStyle = array('size' => 8, 'bold' => false, 'italic' => true); // стили для заголовка таблицы (thead)
    11. $fancyTableStyleItalicRight = array('align' => 'right'); // стили для выполнено/не выполнено
    12. $myTable = $section->addTable($fancyTableStyle);
    13. // шапка
    14. $myTable->addRow();
    15. $myTable->addCell(1500, ['valign' => 'center'])->addText("Дата, время", $fancyTableFontStyle);
    16. $myTable->addCell(7000, ['valign' => 'center'])->addText("Содержание сообщений в течение смены, подписи о сдаче и приемке смены смены", $fancyTableFontStyle);
    17. $myTable->addCell(1500, ['valign' => 'center'])->addText("Визы, замечания", $fancyTableFontStyle);
    18. // инфа
    19. $myTableCellStyle = array('valign' => 'top'); // стили для всех ячеек таблицы
    20. $curDate = ''; // дата/время по дефолту пустые
    21. $myTable->addRow();
    22. $myTable->addCell(1500, $myTableCellStyle)->addText("", $myFontStyle);
    23. $myTable->addCell(7000, $myTableCellStyle)->addText("За время дежурства АО и ТН не было", $myFontStyle);
    24. $myTable->addCell(1500, $myTableCellStyle)->addText("", $myFontStyle);
    25. $footer = $section->addFooter();
    26. $footer->addPreserveText('{PAGE} из {NUMPAGES}', null, array('align' => 'right'));
    27. $file = 'Журнал от '.date('d.m.Y').'.docx';
    28. header("Content-Description: File Transfer");
    29. header('Content-Disposition: attachment; filename="' . $file . '"');
    30. header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
    31. header('Content-Transfer-Encoding: binary');
    32. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    33. header('Expires: 0');
    34. $xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
    35. $xmlWriter->save("php://output");
    я решил его интегрировать в другой код, где в существующий файл подставляются значения. по моей задумке вместо одного из значений должна подставиться созданная таблица.
    Код (Text):
    1. require_once($_SERVER['DOCUMENT_ROOT'] . '/phpword/vendor/autoload.php');
    2. $document = new \PhpOffice\PhpWord\TemplateProcessor($_SERVER['DOCUMENT_ROOT'] . '/development_mr/word_table/template.docx');
    3. $phpWord = new \PhpOffice\PhpWord\PhpWord();
    4. $section = $phpWord->addSection();
    5. $fancyTableStyle = array('borderColor' => 'gray', 'borderSize' => 1, 'cellMargin' => 80,'cellSpacing'=>1); // стили для таблицы
    6. $fancyTableFontStyle = array('size' => 10, 'bold' => true); // стили для заголовка таблицы (thead)
    7. $myFontStyle = array('size' => 8, 'bold' => false, 'italic' => true); // стили для заголовка таблицы (thead)
    8. $fancyTableStyleItalicRight = array('align' => 'right'); // стили для выполнено/не выполнено
    9. $myTable = $section->addTable($fancyTableStyle);
    10. // шапка
    11. $myTable->addRow();
    12. $myTable->addCell(1500, ['valign' => 'center'])->addText("Дата, время", $fancyTableFontStyle);
    13. $myTable->addCell(7000, ['valign' => 'center'])->addText("Содержание сообщений в течение смены, подписи о сдаче и приемке смены смены", $fancyTableFontStyle);
    14. $myTable->addCell(1500, ['valign' => 'center'])->addText("Визы, замечания", $fancyTableFontStyle);
    15. // инфа
    16. $myTableCellStyle = array('valign' => 'top'); // стили для всех ячеек таблицы
    17. $curDate = ''; // дата/время по дефолту пустые
    18. $myTable->addRow();
    19. $myTable->addCell(1500, $myTableCellStyle)->addText("", $myFontStyle);
    20. $myTable->addCell(7000, $myTableCellStyle)->addText("За время дежурства АО и ТН не было", $myFontStyle);
    21. $myTable->addCell(1500, $myTableCellStyle)->addText("", $myFontStyle);
    22. $arResultDocOutfit = [];
    23. $arResultDocOutfit['table'] = $section;
    24. $arResultDocOutfit['company'] = $companyName;
    25. $arResultDocOutfit['gendir'] = $companyGenDir;
    26. $document->setValues($arResultDocOutfit);
    27. $document->saveAs($_SERVER['DOCUMENT_ROOT'] . '/upload/outfitBlank/contract_.docx');
    28. header('Location: /upload/outfitBlank/contract_.docx');
    и ничего не подставляется. Как сделать правильно? Как альтернатива подойдёт способ таблицу в формате html перевести в подходящий формат и вставить в шаблон word.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    думаю как-то так...
    PHP:
    1. $document = new \PhpOffice\PhpWord\TemplateProcessor($_SERVER['DOCUMENT_ROOT'] . '/development_mr/word_table/template.docx');
    2. //$phpWord = new \PhpOffice\PhpWord\PhpWord(); - нафига предыдущий открывали, чтоб потом создавать новый пустой?
    3. $section = $document ->addSection();// добавляем секцию к открытому документу
    принцип ясен... что вся работа должна идти с одним документом... ну и формирование таблицы - именно в нем