26 Январь 2012

Отправка данных из PHP в Office

У публикации есть спонсор (как стать спонсором):

Питомник йоркширских терьеров Люкс Миа продает щенков мини и стандарт.

Приветствую уважаемого читателя! В данной публикации мы снова коснемся темы программирования на PHP средствами фреймворка Kohana — научимся сохранять результат работы скрипта PHP в документ Open Office.

Я часто сталкиваюсь с задачей вывода результатов работы сайта в Word. Ведь отображения страницы в браузере не всегда достаточно: встречаются требования заполнить ту или иную форму, подготовленную в Office, данными, сформированными посредством PHP. Думаю, сегодня прекрасный день, чтобы решить эту задачу.

Для начала давайте скажем решительное НЕТ сложностям работы с форматом *.doc от MS Office. Результаты работы PHP-скрипта мы будем выводить в *.odt-файл (формат офисного текстового документа в пакете Open Office).

Заодно, очистим свои компьютеры от ворованного софта. Этот пост я набираю именно в Open Office и замечательно себя при этом чувствую. Что может быть приятнее, чем на совершенно законных основаниях скачать свежую версию Open Office с официального сайта. А нервно поскуливающих бабулек из бухгалтерии можно успокоить демонстрацией процесса сохранения подготовленного нами документа *.odt в так полюбившийся им *.doc.

Сохранение в Open Office

Оказывается, существует специальный модуль odtPHP, предназначенный для решения поставленной задачи. Разберем принцип работы с данным модулем.

1. Подготавливаем PHP скрипт

<?php
require_once('../library/odf.php');
$odf = new odf("tutoriel1.odt");
$odf->setVars('titre', 'PHP');
$message = "PHP  est un langage de scripts libre ...";
$odf->setVars('message', $message);
$odf->exportAsAttachedFile();       
?>

2-я строка — подключение модуля (в скобках указывается местоположение скачанного модуля odtPHP).

3-я строка — указываем путь к шаблону документа Open Office.

4-я строка — устанавливается значение для переменной titre (titre указывается в шаблонном документе OpenOffice). Теперь вместо кодового {titre} в шаблоне tutoriel1.odt будет выводится буквосочетание «PHP».

2. Подготавливается шаблон

Создаем в Open Office новый документ и в нужных местах ставим метки {titre}и {message}, которые будут заменены на «PHP» и «PHP  est un langage de scripts libre ... ».

А вот как выглядит шаблонный документ:

{titre}
{message}

Думаю, дальше пояснять нет смысла все и так понятно из раздела Tutorials.

Мы будем копать глубже и прикрутим к фреймворку Kohana 3.2 модуль для работы с odt на основе odtPHP. Заодно я проиллюстрирую процесс вывода результатов работы скрипта PHP в Office-документ.

Если вы не знакомы с фреймворком Kohana, то у меня есть видеокурс, посвященный его изучению.

Реальная задача по выводу результатов работы PHP скрипта в Office

Постановка задачи. Есть сайт, на котором выводится таблица с номерами сертификатов и фамилиями лиц, прошедших обучение. Необходимо выбрать чекбоксом нужные фамилии и, нажав кнопку Экспорт, отправить данные по выбранным слушателям курсов в офисный документ утвержденной формы.

Видеоурок

Скачать видеоурок (21.2 МБ, *.wmv).

Публикую ссылку на загрузку заточки модуля odtPHP под Kohana 3.2.

Форма Office-документа:

Форма Word

Теперь пройдем все шаги от загрузки нужного модуля для Kohana 3.2 до открытия готового документа Open Office.

Итак, я считаю, что вы знакомы с видеокурсом по Kohana 3. Поэтому, без лишних скромностей, создайте в папке application каталог templates. Будем хранить там наши odt-шаблоны.

В свежесозданный каталог templates сохраним odt-докумет следующего вида:

Шаблон odt для вставки данных из PHP

Как видно из скриншота, в местах вывода информации по обучаемому (ФИО, номер сертификата и т. д.) установлены специальные символы ({number}, {surname}, {name}...), которые будут заменены на значения, полученные PHP-скриптом.

Поскольку строк в таблице может быть несколько — необходимо выводить информацию по обучаемым в цикле (каждая итерация выводит данные одного курсанта). Именно это и означает связка

[!-- BEGIN row.certificates --]
...
[!-- END row.certificates --]

Все, что находится между данными операторами будет повторятся в цикле для блока данных row.certificates, который мы подготовим в контроллере.

Следующий шаг — скачать и подключить специальный модуль для Kohana 3.2, созданный на основе odtPHP.

Для подключения модуля нужно скопировать папку odtphp в каталог modules и указать инструкцию подключения в файле application/bootstrap.php

Подключение модуля odtPHP в bootstrap.php

Далее, в методе, запускающем формирование odt-файла нужно указать следующий код:

protected function export_certificates()
	{
		$odf = new Odtphp(APPPATH.'templates/register.odt');
		
		$odf->setVars('privet', 'Иван', $encode = TRUE, $charset='UTF-8');
		
		$seg = $odf->setSegment('certificates');
		if(isset($_POST['cb']))
		{
			foreach($_POST['cb'] as $key => $null)
			{
				$cert = ORM::factory('certificate', $key);
				
				$seg->setVars('number', $cert->number, $encode = TRUE, $charset='UTF-8');
				$seg->setVars('surname', $cert->surname, $encode = TRUE, $charset='UTF-8');
				$seg->setVars('name', $cert->name, $encode = TRUE, $charset='UTF-8');
				$seg->setVars('lastname_ru', $cert->lastname_ru, $encode = TRUE, $charset='UTF-8');
				$seg->setVars('name_ru', $cert->name_ru, $encode = TRUE, $charset='UTF-8');
				$seg->setVars('patronymic_ru', $cert->patronymic_ru, $encode = TRUE, $charset='UTF-8');
				$seg->setVars('birthdate', $cert->birthdate, $encode = TRUE, $charset='UTF-8');
				$seg->setVars('certdate', $cert->certdate, $encode = TRUE, $charset='UTF-8');
				
				$seg->merge();
			}
		}
		
		$odf->mergeSegment($seg);
		$odf->exportAsAttachedFile();
		
		exit;
	}

Если что-то не понятно — смотрите видеоурок.

Еще раз публикую ссылку на загрузку заточки модуля odtPHP под Kohana 3.2.

С уважением, Андрей Морковин.