За последние 24 часа нас посетил 17731 программист и 1648 роботов. Сейчас ищут 939 программистов ...

docx и xlsx замена в шаблоне

Тема в разделе "Решения, алгоритмы", создана пользователем igordata, 4 ноя 2013.

  1. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Функция заменяет в файлах *.docx и *.xlsx искомое.
    То, что будет заменяться, необходимо набирать не используя стрелки на клавиатуре и не шевеля курсор, иначе текст разбивается умным майкрософтовским движком на элементы.
    Т.е. нельзя написать сначала {{}}, а потом вписать внутрь слово. Надо писать сразу целиком.
    Код (PHP):
    1. function MSOxReplace($filename, $replacements) {
    2.   try {
    3.     //ThrowOnFalse(is_file($filename));
    4.     $zip = new ZipArchive;
    5.     $res = $zip->open($filename);
    6.     //ThrowOnFalse($res);
    7.     $innerpaths = [
    8.       'xl/sharedStrings.xml',
    9.       'word/document.xml',
    10.       'word/header1.xml',
    11.       'word/header2.xml',
    12.       'word/header3.xml',
    13.       'word/footer1.xml',
    14.       'word/footer2.xml',
    15.       'word/footer3.xml',
    16.       ];
    17.     foreach ($innerpaths as $innerpath) {
    18.       $contents = $zip->getFromName($innerpath);
    19.       if ($contents === false) {
    20.         continue;
    21.       }
    22.       $zip->addFromString($innerpath, str_replace(array_keys($replacements), $replacements, $contents));
    23.     }
    24.     $zip->close();
    25.     return true;
    26.   } catch (Exception $exc) {
    27.     //echo $exc->getTraceAsString();
    28.   }
    29.   return false;
    30. }
    31.  
    32. $replacements = [
    33.   '{{NAME}}' => 'Igor',
    34.   '{{PHONE}}' => '123654',
    35. ];
    36.  
    37. MSOxReplace(ROOT . '/doc.xlsx', $replacements);
    38. MSOxReplace(ROOT . '/doc.docx', $replacements);