Как создать файл word с колонтитулами и динамической таблицей?

bicyclist

Новичок
я знаю отдельно как создать файл с динамической таблицей и как вставить переменные в уже существующий файл-шаблон с помощью библиотеки PHPWord.

создание файла с динамической таблицей:
Код:
$fp = fopen("my_file.doc", 'w+');
$str = '
<html><body>
<div style="margin: auto; text-align: center; width: 20%; ">
<div style="font-weight: bold; text-align: center">ОТЧЕТ ОБ ОКАЗАННЫХ УСЛУГАХ</div>
<div style="margin: auto; width: 40%; text-align: center;">по Договору оперативного обслуживания и диспетчерского управления<br>
объектами электросетевого хозяйства<br>
№ <br>
За период с  г. по  г.
<br><b>Оперативное обслуживание</b></div>
</div>';
$str .= '<div style="margin: auto; text-align: center;">
  <table style="border-collapse: collapse; border: 1px solid black; width: 100%; margin: auto; "><thead>
    <tr>
        <th style="text-align: center; border: 1px solid black; padding: 5px; width: 7%; font-weight: bold; ">№<br>п/п</th>
        <th style="border: 1px solid black; padding: 5px; width: 80%; font-weight: bold; ">Наименование мероприятий</th>
<th style="border: 1px solid black; padding: 5px; text-align: center; font-weight: bold; ">Дата исполнения</th>
    </tr>
  </thead><tbody>
    <tr>
        <td style="text-align: center; border: 1px solid black; padding: 5px; width: 7%;">'.$index.'</td>
        <td style="border: 1px solid black; padding: 5px; width: 80%">Ведение требуемого режима работы оборудования.</td>
<td style="border: 1px solid black; padding: 5px; text-align: center;">Круглосуточно</td>
    </tr>
';
foreach($rsOp as $arItem):
    $str .= '<tr>
        <td style="text-align: center; border: 1px solid black; padding: 5px;">'.$index.'</td>
        <td style="border: 1px solid black; padding: 5px;">'.$arItem['PROPS']['SWITCHING']['VALUE'].'<p>'.$arTp[$arItem['PROPS']['JK']['VALUE']]['NAME'].' ('.$adres.')</p></td>
        <td style="text-align: center; border: 1px solid black; padding: 5px;"></td>
    </tr>';
endforeach;
$str .= '</tbody></table>';
$str .= '<div style="margin: auto; text-align: center; margin: auto; ">
    <table>
    <tr>
    <td style="font-weight: bold; text-align: center; padding: 10px; padding-left: 30px; padding-right: 30px"></td>
    <td style="font-weight: bold; text-align: center; padding: 10px; padding-left: 30px; padding-right: 30px"></td>
    </tr>
    <tr>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">Заказчик:</td>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">Исполнитель:</td>
    </tr>
    <tr>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">'.$companyName.'</td>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">ООО «СЭС»</td>
    </tr>
    <tr>
    <td style="font-weight: bold; text-align: center; padding: 10px; padding-left: 30px; padding-right: 30px"></td>
    <td style="font-weight: bold; text-align: center; padding: 10px; padding-left: 30px; padding-right: 30px"></td>
    </tr>
    <tr>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">Генеральный директор</td>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">Генеральный директор</td>
    </tr>
    <tr>
    <td style="font-weight: bold; text-align: center; padding: 10px; padding-left: 30px; padding-right: 30px"></td>
    <td style="font-weight: bold; text-align: center; padding: 10px; padding-left: 30px; padding-right: 30px"></td>
    </tr>
    <tr>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">_____________/'.$companyGenDir.'</td>
    <td style="font-weight: bold; text-align: center; padding: 5px; padding-left: 30px; padding-right: 30px">_____________/А.Г. Кунакбаев</td>
    </tr>
    </table>
</div>
</body></html>';
$str=iconv('UTF-8','windows-1251', $str);
fwrite($fp, $str);
fclose($fp);
header('Location: my_file.doc');
Вставка переменных в уже существующий файл-шаблон:
Код:
$arResultDocOutfit["colontitul_top"] = [];
$arResultDocOutfit["colontitul_top"] = "Верхний тестовый колонтитул";
$arResultDocOutfit["colontitul_bottom"] = "Нижний тестовый колонтитул";
$document = new \PhpOffice\PhpWord\TemplateProcessor($_SERVER['DOCUMENT_ROOT'] . '/development_mr/phpword/outfitBlank.docx');
$document->setValues($arResultDocOutfit);
$document->saveAs($_SERVER['DOCUMENT_ROOT'] . '/upload/outfitBlank/'.$file);
echo $file;
Но там заранее в файле-шаблоне надо создать колонтитулы и в них вставить текст для замены. как создавать колонтитулы программно я не знаю.
Как мне одновременно вставить таблицу со всеми стилями, и колонтитулы? лучше будет с PHPWord или без него?
 

Тугай

Новичок
Ты странное делаешь, формируешь html, называешь его file.doc, а потом колонтитулы хочешь. :)

C OfficeXP можно работать с форматом docx, это просто zip архив. Сделай свой документ-шаблон в Word'е со всеми стилями и колонтитулами. В docx в этом zip архиве, есть файлы word\document.xml и word\header1.xml это документ и колонитул.
Так же как ты через html сделал, делай также с xml и заменяй файлы в архиве через ZipArchive.

в xml не все так страшно как кажется, word разбивает текст на слова и куча тегов с форматированием на каждое слово, но можно писать и чище,
объединяя разбиения.

Код:
<w:p><w:r><w:t>Hello Привет</w:t></w:r></w:p>
<w:tbl>
    <w:tblPr>
        <w:tblStyle w:val="TableGrid"/>
    </w:tblPr>
    <w:tr>
        <w:tc><w:tcW w:w="3190" w:type="dxa"/><w:p><w:r><w:t>C1</w:t></w:r></w:p></w:tc>
        <w:tc><w:tcW w:w="3190" w:type="dxa"/><w:p><w:r><w:t>C2</w:t></w:r></w:p></w:tc>
        <w:tc><w:tcW w:w="3190" w:type="dxa"/><w:p><w:r><w:t>C3</w:t></w:r></w:p></w:tc>
    </w:tr>
    <w:tr>
        <w:tc><w:tcW w:w="3190" w:type="dxa"/><w:p><w:r><w:t>C4</w:t></w:r></w:p></w:tc>
        <w:tc><w:tcW w:w="3190" w:type="dxa"/><w:p><w:r><w:t>C5</w:t></w:r></w:p></w:tc>
        <w:tc><w:tcW w:w="3190" w:type="dxa"/><w:p><w:r><w:t>C6</w:t></w:r></w:p></w:tc>
    </w:tr>
</w:tbl>

Скорей всего можно все сделать через PHPWord, но программой воспроизвести все форматирование не так и быстро будет и не так наглядно как если напрямую в word делать шаблон.
 

bicyclist

Новичок
а есть ли способ в PHPWord таблицу формата html вставить в шаблон файла word? то есть автоматически перевести из формата html в формат word и вставить в файл.
 
Сверху