PHP + DOCX

Standard

DOCX формат это обычный ZIP архив, который можно открыть любым архиватором.

Структура docx

Структура docx

Все содержимое документы находиться в файле word/document.xml. Открываем файл в Word’e, добавляем пару переменных в документ, например: {NAME}, {SURNAME}. И сохраняем документ.

Для работы с Zip архивом в PHP я использую ZipArchive.

 

<?php
//Указываем путь до подготовленного документа
$docxFile = '/document.docx';

//Список параметров
$params = array(
    '{NAME}'    => 'Anatoliy',
    '{SURNAME}' => 'Skornyakov'
);

if (!file_exists($docxFile)) {
    die('File not found.');
}

$zip = new ZipArchive();

if (!$zip->open($docxFile)) {
    die('File not open.');
}

$documentXml = $zip->getFromName('word/document.xml');

//Заменяем все найденные переменные в файле на значения
$documentXml = str_replace(array_keys($params), array_values($params), $documentXml);

$zip->deleteName('word/document.xml');
$zip->addFromString('word/document.xml', $documentXml);

//Закрываем и сохраняем архив
$zip->close();

8 thoughts on “PHP + DOCX

  1. Vlad

    Как вы решаете проблему с внутренностями docx-файла. Я тоже думал, что все так легко, но по факту Word вставляет между символами свои теги и получается каша:

    {NAME}

    Помогает только вставка в документ тегов «Как текст», т.е. без каких-либо форматов.

  2. Yuki

    Что делать, если у меня в *.docx хранятся данные в таблицах, да еще текст вставлен вставками(документ создан другой программой), мне эти данные нужно считать и занести в БД, но проблема в том, что при чтении этого файла получается каша, это еще мягко выражаясь, можно ли получить данные с xml-тегами?

  3. Алексей

    Кстати, если нужно переконвертировать в doc — помогает libreoffice со свей консольной командой
    soffice —headless —convert-to doc mydoc.docx

  4. Сергей

    а как же, например, делать если нужно данные в цикле подставлять, то есть если естьшаблон, например, на 2 листа, а нужно сделать по этому шаблону, файл на 20 листов, чтобы переменная {ADRESS} заменялась не один раз, а несколько!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *