Phpword loadtemplate не работает

Drupal Русскоязычное сообщество

Доброго времени суток!
Есть необходимость экспортировать из полей в шаблон MS Word. google привел к livedocx но спустя время я не могу туда логиниться и соответственно не могу работать с шаблоном. Возможно есть другое, более стабильное решение моей задачи?
Заранее спасибо)

Комментарии

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Есть phpword, если речь идет именно о поиске бесплатной библиотеки.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Есть phpword, если речь идет именно о поиске бесплатной библиотеки.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Ага, подключал.
Создается шаблон (docx, в моем случае).
Пишется модуль, в котором надо кидать данные в документ.
В коде модуля в нужном месте — например, в хуке hook_node_presave() — подключается библиотека, создается объект нужного класса из библиотеки, открывается шаблон, нужные поля кидаются в шаблон, все это сохраняется в файл. Примеры есть в описании библиотеки, там все прозрачно.

Разве что если кракозябры в документе результирующем полезут, надо будет подправить перекодировку в utf8, она там глючная была раньше, если версию новую не выпустили — то такой и осталась.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Разве что если кракозябры в документе результирующем полезут, надо будет подправить перекодировку в utf8, она там глючная была раньше, если версию новую не выпустили — то такой и осталась.

я ни разу не писал модули. можно как ни будт использовать с rules? там по условию можно выполнить php-код.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

А без разницы, код почти один и тот же будет, только с модулем удобнее работать, чем с окошком в rules.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Читайте также:  Как настроить роутер кеенетик

А без разницы, код почти один и тот же будет, только с модулем удобнее работать, чем с окошком в rules.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Это в коде библиотеки. Погуглите, известная проблема, там в паре мест надо utf8_encode() удалить, или что-то типа того.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Это в коде библиотеки. Погуглите, известная проблема, там в паре мест надо utf8_encode() удалить, или что-то типа того.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Появилась новая ошибка)
Данные вставляются в пустую строчку, а когда нужно вставить в текст — не получается.
У Вас возникала такая проблема?
В чем может быть проблема?

Поставьте модуль devel.
dpm($document);
сразу после создания класса что показывает?

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Поставьте модуль devel.
dpm($document);
сразу после создания класса что показывает?

dpm($document); ставить в теле моего модуля?

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Доброй ночи! Простите что так настырно прошу помощи))
Появилась новая ошибка при использовании rules)
Данные вставляются в пустую строчку, а когда нужно вставить в текст — не получается.
У Вас возникала такая проблема?
В чем может быть проблема?
Последовал Вашему совету и начал разбираться с созданием модуля. для вставки значений использую хук node_presave
это содержимое файла word.module из созданного мною модуля
loadTemplate(‘/home/ho4uappc/public_htmlsites/default/files/templates/foreign.docx’);
$document->setValue(‘lastnameua’, $node->field_lastname_ua[‘und’][0][‘value’]);
$document->setValue(‘nameua’, $node->field_name_ua[‘und’][0][‘value’]);
$document->setValue(‘patronymicua’, $node->field_patronymic_ua[‘und’][0][‘value’]);

когда сохраняю ноду получаю ошибку:
Fatal error: Call to a member function setValue() on a non-object in /home/ho4uappc/public_html/sites/all/modules/word/word.module on line 7

Заранее благодарен за помощь!)))?>

Функция dpm() модуля devel — один из важнейших инструментов отладки, используется для вывода быстрого дампа объектов, массивов, переменных.
После вызова loadTemplate() поставьте
dpm($document);
и даже
return ;
чтоб код дальше не выполнялся. Посмотрите, что внутри объекта $document. Если там ничего, значит вам не удалось загрузить темплейт.

loadTemplate(‘/home/ho4uappc/public_htmlsites/default/files/templates/Template.docx’);
dpm($document);
return;
>
dpm ничего не показал + Warning: Invalid error type specified в функции PHPWord->loadTemplate() (строка 226 в файле /home/ho4uappc/public_html/sites/default/files/PHPWord/PHPWord.php).

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

параметр пропустил
function word_node_presave ( $node )

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

ну это я между делом сказал , а по поводу объекта , так он просто файл не находит

Когда делал то же самое при помощи рулс не мог вставить значение в текст. В пустую строку вставлялось, а в текст нет.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

А, вспомнил, вдруг поможет.

Если есть такой косяк, что PHPWord нормально заменяет шаблоны, если они на отдельной строке, но не заменяет — если они в тексте, то объясняю.
Шаблоны эти докиксовые — очень капризны. Крайне нежелательно после вставки шаблонов в документ и сохранения, редактировать этот документ. Кроме того. Если у вас есть шаблоны типа или %%MY_TEMPLATE%% или еще какие-нибудь символы, то docx может при сохранении взять и превратить эти шаблоны вот в такое: % %MY_TEMPLATE %% — и вы об этом не узнаете. И работать не будет. Единственный способ отловить — открыть шаблон docx как зип-архив (ага, так можно), найти в нём документ и отредактировать его emacs-ом (лучше всего, именно им, да). С помощью имакса (в байтовом режиме, или как там его) — найти все шаблоны и проверить, не кривые ли они, и если кривые — исправить, т.е. прямо переставить символы так чтоб шаблон без «разрывов» был. Сохранить, и после этого шаблон больше в ворде не открывать. Вот такая магия.

В инете где-то про это даже статья была, но щас так сразу не найду.

  • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

Если есть такой косяк, что PHPWord нормально заменяет шаблоны, если они на отдельной строке, но не заменяет — если они в тексте, то объясняю.
Шаблоны эти докиксовые — очень капризны. Крайне нежелательно после вставки шаблонов в документ и сохранения, редактировать этот документ. Кроме того. Если у вас есть шаблоны типа или %%MY_TEMPLATE%% или еще какие-нибудь символы, то docx может при сохранении взять и превратить эти шаблоны вот в такое: % %MY_TEMPLATE %% — и вы об этом не узнаете. И работать не будет. Единственный способ отловить — открыть шаблон docx как зип-архив (ага, так можно), найти в нём документ и отредактировать его emacs-ом (лучше всего, именно им, да). С помощью имакса (в байтовом режиме, или как там его) — найти все шаблоны и проверить, не кривые ли они, и если кривые — исправить, т.е. прямо переставить символы так чтоб шаблон без «разрывов» был. Сохранить, и после этого шаблон больше в ворде не открывать. Вот такая магия.

В инете где-то про это даже статья была, но щас так сразу не найду.

А если использовать PDF? Мне по сути все ровно в как виде выодить: pdf или docx. Документ просто будет печататься. Погуглил и нашел несколько статей по работе php и pdf. пока не нашео ничего по использованию шаблонов $

Источник

Работа с phpWord. Заполнение шаблона договора docx

Шаблон договора для phpWord

Начну с постановки задачи. А она довольно простая — работая над сайтом клиента по прокату автомобилей возникла необходимость несколько автоматизировать рутинные операции. В частности требовалось при оформлении аренды на сайте автоматически заполнять в договоре некоторые поля. Вот этим и займемся.

Для работы нам потребуется замечательная библиотека phpWord. Она имеет огромное количество возможностей, мы же рассмотрим ее способность заполнять готовые шаблоны документов.

Итак, мы скачали phpWord, распаковали архив и залили на веб-сервер. В моем случае речь идет о версии 0.6.2 Beta.

phpWord заливка на сервер

Теперь нам необходимо подготовить сам шаблон. Для этого запускаем MS Word или даже Wordpad и набираем текст договора. Для примера я набросал тестовый договор, который выглядит вот так (кликабельно):

Давайте определимся, что в этом шаблоне мы поручим заполнять php скрипту. К примеру, пусть это будет номер договора с датой, а также ФИО продавца и номер паспорта. Теперь давайте превратим наш договор в шаблон, с которым будем работать дальше.

Итак, для заполнения мы определили данные, давайте подберем для них имена. Это может быть транслитерация или английское написание, вы можете выбрать по вкусу.

Данные Переменная
Номер договора d_num
Дата договора d_date
Фамилия last_name
Имя name
Отчество surname

Замечательно. Теперь делаем следующее — на тех местах, где у нас данные, мы их удаляем и вставляем имена переменных в виде

Т. е. там, где у нас номер договора 123 мы пишем $ и т. д. для всех переменных. В итоге получится вот такой шаблон договора:

Шаблон договора для phpWord

Отнеситесь к этому внимательно — ошибок допускать нельзя. Сохраняем полученный шаблон под именем Template.docx (можно назвать по своему).

Внимание! При сохранении документа в Word 2010 поставьте чекбокс «Поддерживать совместимость с предыдущими версиями Word» иначе работать не будет.

Вот теперь наш шаблон готов, теперь давайте научим php заполнять его.

Создаем php файл (к примеру, index.php) со следующим содержимым:

Вот и все. Если теперь мы запустим выполним наш скрипт, то в итоге получим заполненный данными шаблон договора:

Как видно, скрипт успешно заполнил шаблон, вот только с русскими символами беда — они выглядят не так, как задумывалось. Как решить эту проблему читайте в статье.

На этом все. Надеюсь, что хоть немного помог читателю разобраться с заполнением docx файлов на php. Для изучения все материалы можно скачать в виде архива.

Меток нет. Похожие записи

  • No related posts.

14 комментариев: Работа с phpWord. Заполнение шаблона договора docx

Спасибо за статью! Много прочитала, но помогла именно ваша
А как быть, чтобы отдать полученный документ на скачивание, а не сохранять на жесткий диск?
Я делаю:

$word = new PHPWord();
header(‘Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document’);
header(‘Content-Disposition: attachment;filename=»document.docx»‘);
header(‘Cache-Control: max-age=0’);

$template = $word->loadTemplate(dirname(dirname(__file__)) . «/documents/blancAct1.docx»);
$template->setValue(‘rrr’, ‘замена’);
$writer = PHPWord_IOFactory::createWriter($template, ‘Word2007’);
$writer->save(‘php://output’);
Отдает битый пустой файл

У меня тоже PHP Word на выходе отдает какой-то битый файл, который не открывается в Word. При этом файл не пустой, но почему-то имеет неверный формат. При просмотре файла в Editre- в нем полно всякой ерунды, включая заголовки сайта, меню, куки php. Не знаете в чем проблема? Почему библиотека phpword не работает как надо?

метод saveAs() надо вызвать, тока тогда сохранит изменения

А как вообще эту библиотеку прикрутить к тому же денверу, сказано скиньте в ваш вебсервер, куда уже только не кидал не видит он её. кидал home\домен\www\ кидал так же home\licalhost\

А процедурным стилем как вносить данные в документ?

Не работает ваш пример.

скачал ваши исходники вот код index.php
loadTemplate(‘Template.docx’);
$document->setValue(‘d_num’, ’777′);
$document->setValue(‘d_date’, ’04.10.2014′);
$document->setValue(‘last_name’, ‘Никоненко’);
$document->setValue(‘name’, ‘Сергей’);
$document->setValue(‘surname’, ‘Васильевич’);
$document->save(‘Template_full.docx’);
?>

вот эта строка вызывает подозрения require_once ‘PHPWord.php’; вы хотите подключить файл ‘PHPWord.php’ которого нет,среди скачанных файлов, что вообще за бред? зря только время потратил.

А скачать по самой первой ссылке что мешает?

По первой ссылке нет нужного файла.

Общее замечание. Статья относится к библиотеке 2011 года PHPWord. Она была такая, и исходники есть, и всё так. На гитхабе сейчас лежит её далёкий потомок PhpWord. В нём изменено очень много чего (например, не надо кривить исходники ради корректной работы с русским языком). И, в частности, пример выглядит радикально по-другому:

require_once(‘vendor/autoload.php’); // ставится ТОЛЬКО через Composer!
$_doc = new \PhpOffice\PhpWord\TemplateProcessor(‘Template.docx’);
$_doc->setValue(‘d_num’, ’10/29-77-Ю’); //номер договора
// вывод непосредственно в браузер
header(‘Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document’);
header(‘Content-Disposition: attachment;filename=»dogovor.docx»‘);
header(‘Cache-Control: max-age=0’);
$_doc->saveAs(‘php://output’);
die;

Думаю, это замечание (о наличии новой версии либы с новыми вызовами) надо добавить в описание. Кому что удобнее: свежая либа с композером и хреновой горой пхпового мусора, или старая, но с багами, пусть решает сам.
dixi

Источник

Оцените статью