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 нормально заменяет шаблоны, если они на отдельной строке, но не заменяет — если они в тексте, то объясняю.
Шаблоны эти докиксовые — очень капризны. Крайне нежелательно после вставки шаблонов в документ и сохранения, редактировать этот документ. Кроме того. Если у вас есть шаблоны типа
В инете где-то про это даже статья была, но щас так сразу не найду.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Если есть такой косяк, что PHPWord нормально заменяет шаблоны, если они на отдельной строке, но не заменяет — если они в тексте, то объясняю.
Шаблоны эти докиксовые — очень капризны. Крайне нежелательно после вставки шаблонов в документ и сохранения, редактировать этот документ. Кроме того. Если у вас есть шаблоны типа
В инете где-то про это даже статья была, но щас так сразу не найду.
А если использовать 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
Источник