Данные с php на word

Первое с чего нужно начать, это создать .docx документ на своем ПК, например template.docx

Для примера я взял куски из договора на создание сайта

Подготавливаем шаблон word документа

Открываем word файл и начинаем его шаблонизировать путем замены текста на переменные синтаксиса типа ${data}

У нас будут следующие переменные, которые мы будем подставлять в документ:

${num_dogovor} — номер догвоора
${city} — город
${date} — текущая дата
${name} — ФИО
${company} — Название Организации ООО
${summa} — Сумма
${summa_str} — Сумма, прописью
${summa_nalog} — Налог, 6% от суммы 
${summa_nalog_str} — Налог, 6% от суммы (прописью)
${ur_address} — Юр. адрес
${post_address} — Почтовый адрес
${company_ogrn} — ОГРН
${company_okpo​​​​​​​} — ОКПО
${company_kpp​​​​​​​} — КПП
${company_inn​​​​​​​} — ИНН организации
${company_bank​​​​​​​} — Название банка
${company_ks​​​​​​​} — кор. счет
${company_rs​​​​​​​} — р. счет
${direktor​​​​​​​} — ФИО директора

Далее скачиваем библиотеку PhpWord

//Подключаем библиотеку
require $_SERVER["DOCUMENT_ROOT"].'/lib/phpword/autoload.php';

//создаем класс
$phpWord = new  PhpOfficePhpWordPhpWord(); 
$_doc = new PhpOfficePhpWordTemplateProcessor('template.docx');

Синтаксис для замены переменных

$_doc->setValue('num_dogovor', $number_document); 

Подготовим пару переменных

//запихиваем сумму в переменную, что бы далее с ней поработать
$summa = 25550;

// делаем красивый формат
$summa_format = number_format($summa, 2, ',', ' ');

// вычислим налог от суммы (6%) и так же определим в отдельную переменную красивый формат суммы
$summa_nalog = $summa * 6 / 100; 
$summa_nalog_format = number_format($summa_nalog, 2, ',', ' ');

Подставляем, заменяем переменные в word документ

$_doc->setValue('num_dogovor', $number_document); 
$_doc->setValue('city', "г. Сочи"); 
$_doc->setValue('name', "Масков Илон Гениальнович"); 
$_doc->setValue('date', date("d.m.Y")); 
$_doc->setValue('company', "ООО НЕ ПРОХОДИТЕ МИМО"); 
$_doc->setValue('summa', $summa_format); 
$_doc->setValue('summa_str', num2str($summa));
$_doc->setValue('summa_nalog', $summa_nalog);
$_doc->setValue('summa_nalog_str', num2str($summa_nalog));
$_doc->setValue('company_ogrn', "ОГРН компании");
$_doc->setValue('company_inn', "ИНН компании");
$_doc->setValue('company_kpp', "КПП компании");
$_doc->setValue('company_bank', "Какое то название банка");
$_doc->setValue('company_bik', "бик банка");
$_doc->setValue('company_ks', "12342352456235");
$_doc->setValue('company_rs', "66666666666");
$_doc->setValue('ur_address', "Юридический адрес, какой-нибудь");
$_doc->setValue('post_address', "Фактический адрес");
$_doc->setValue('direktor', "Альберт Енштейн");
$_doc->setValue('company_okpo', "4444444");

Сохраняем сгенерированный word файл на сервер

$img_Dir_Str = "/files/";
$img_Dir = $_SERVER['DOCUMENT_ROOT']."/". $img_Dir_Str; 
@mkdir($img_Dir, 0777);
$file = str_replace("/","-", "Договор №".date("d-m-Y")).".docx";

$_doc->saveAs($img_Dir.$file);

Обратите внимание на строку: $_doc->setValue('summa_str', num2str($summa)); и   $_doc->setValue('summa_nalog_str', num2str($summa_nalog));

В ней мы используем функцию перевода числа в прописной вид

Функция перевода числа в прописной вид

function num2str($num) {
	$nul='ноль';
	$ten=array(
		array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
		array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
	);
	$a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
	$tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
	$hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
	$unit=array( // Units
		array('коп.' ,'коп.' ,'коп.',	 1),
		array('рубль'   ,'рубля'   ,'рублей'    ,0),
		array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
		array('миллион' ,'миллиона','миллионов' ,0),
		array('миллиард','милиарда','миллиардов',0),
	);
	//
	list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
	$out = array();
	if (intval($rub)>0) {
		foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
			if (!intval($v)) continue;
			$uk = sizeof($unit)-$uk-1; // unit key
			$gender = $unit[$uk][3];
			list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
			// mega-logic
			$out[] = $hundred[$i1]; # 1xx-9xx
			if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
			else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
			// units without rub & kop
			if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
		} //foreach
	}
	else $out[] = $nul;
	$out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
	$out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
	return trim(preg_replace('/ {2,}/', ' ', join(' ',$out)));
}

/**
 * Склоняем словоформу
 * @ author runcore
 */
function morph($n, $f1, $f2, $f5) {
	$n = abs(intval($n)) % 100;
	if ($n>10 && $n<20) return $f5;
	$n = $n % 10;
	if ($n>1 && $n<5) return $f2;
	if ($n==1) return $f1;
	return $f5;
}

Статья подготовлена для Вас сайтом kisameev.ru

Перевел: Кисамеев Дмитрий

Урок создан: 3 октября 2021 г.

Статью просмотрели: 8618

Понравилось: 17

PHPWord - создание MS Word документов средствами PHP

От автора: не так давно на нашем сайте были опубликованы уроки по работе с таблицами Microsoft Excel средствами языка PHP, которые вызвали значительный интерес у нашей аудитории и поэтому, сегодня я решил показать Вам, как создавать документы Microsoft Word ,формата .docx, используя мощнейшую библиотеку PHPWord.

скачать исходникискачать урок

Актуальную версию библиотеки PHPWord, вы найдете на сервисе GitHub.

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

Установка PHPWord

Установка PHPWord, может быть выполнена двумя способами. Первый способ – ручной, при котором Вы скачиваете архив с последней актуальной версией PHPWord, далее, выполняете распаковку, копируете файлы в собственный проект и подключаете на соответствующих страницах. То есть достаточно стандартный способ. И второй – так сказать, автоматический способ установки, используя инструмент Composer, который мы будем использовать в данном уроке.

Кстати, Вы, наверное, заметили, что в своих уроках, для установки различных библиотек, я призываю Вас использовать Composer. Так как для простых проектов, в ручную, вполне можно скачивать необходимые элементы, но если мы работаем над более сложным скриптом, то порой затруднительно скачать все необходимые элементы и правильно их установить.

Итак, открываем командную строку и переходим в каталог нашего проекта, используя команду “CD имя папки”.

Далее, используя конструкцию “composer require”, указываем от какой библиотеки “зависит” наш проект и выполняем инструкцию.

composer require phpoffice/phpword

После того как Composer, завершил скачивание и установку библиотеки, необходимо подключить файл autoload.php, который расположен в папке vendor, к Вашему проекту.

require ‘vendor/autoload.php’;

Далее, создаем объект главного класса библиотеки.

$phpWord = new  PhpOfficePhpWordPhpWord();

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

Создание документа MS Word

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

$phpWord>setDefaultFontName(‘Times New Roman’);

Затем зададим, размер шрифта, при помощи метода setDefaultFontSize(размер шрифта).

$phpWord>setDefaultFontSize(14)

Перед добавлением текстовых данных, необходимо определить параметры всего документа в целом. Для получения объекта параметров документа, используем метод getDocInfo().

$properties = $phpWord>getDocInfo();  

Используя полученный объект, зададим основные параметры документа.

$properties>setCreator(‘Name’);

$properties>setCompany(‘Company’);

$properties>setTitle(‘Title’);

$properties>setDescription(‘Description’);

$properties>setCategory(‘My category’);

$properties>setLastModifiedBy(‘My name’);

$properties>setCreated(mktime(0, 0, 0, 3, 12, 2015));

$properties>setModified(mktime(0, 0, 0, 3, 14, 2015));

$properties>setSubject(‘My subject’);

$properties>setKeywords(‘my, key, word’);  

При этом использовались следующие методы (каждый метод устанавливает определенный глобальный параметр документа):

setCreator() – автор документа;

setCompany() – организация автора документа;

setTitle() – заголовок документа;

setDescription() – краткое описание документа;

setCategory() – категория документа;

setLastModifiedBy() – автор последнего редактирования документа;

setCreated() – дата создания документа;

setModified() – дата редактирования документа;

setSubject() – тема документа;

setKeywords() – ключевые слова документа.

Собственно, теперь мы можем добавить необходимые текстовые данные в будущий документ MS Word, но перед этим мы должны определиться с понятием раздела, которое используется библиотекой PHPWord, для работы с документом.

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

$sectionStyle = array(

‘orientation’ => ‘landscape’,

‘marginTop’ => PhpOfficePhpWordSharedConverter::pixelToTwip(10),

‘marginLeft’ => 600,

    ‘marginRight’ => 600,

    ‘colsNum’ => 1,

    ‘pageNumberingStart’ => 1,

    ‘borderBottomSize’=>100,

    ‘borderBottomColor’=>‘C0C0C0’

);

$section = $phpWord>addSection($sectionStyle);

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

orientation — расположение раздела, в виде альбомного листа (значение по умолчанию portrait);

marginTop – верхний отступ;

marginLeft – отступ от левого края;

marginRight – отступ от правого края;

colsNum – количество колонок, в которых будут отображаться данные;

pageNumberingStart – страница, с которой будет начата нумерация страниц;

borderBottomSize – размер нижней рамки;

borderBottomColor – цвет нижней рамки.

Полный список настроек приведен в разделе “Styles”, официальной документации PHPWord.

При, этом у Вас, скорее всего, возник вопрос, в каких единицах измерения проставляются значения размеров и отступов? В качестве единиц измерений используются типографические твипы.

Твип (англ. twip) — типографская единица измерения, равная одной двадцатой пункта, или 1/1440 дюйма, или 1/567 сантиметра (приближённо).

Конечно, разработчикам не совсем удобно использовать данную единицу измерения, для определения размеров, поэтому библиотека PHPWord, содержит в своем составе, специальный класс конвертер, основных известных единиц в твипы. К примеру, для конвертации “пискселей в твипы”, необходимо использовать следующий метод pixelToTwip() , который переведет значение в пикселях, передаваемое в качестве первого параметра в твипы.

PhpOfficePhpWordSharedConverter::pixelToTwip(10)

Для добавления текста, в будущий документ, необходимо использовать метод addText($text, [$fontStyle], [$paragraphStyle]). В качестве параметров, при вызове данного метода, необходимо передать следующее:

$text – текст, который необходимо отобразить на странице документа. При этом текст не должен содержать тегов HTML, поэтому, как правило, его обрабатывают функцией htmlspecialchars().

$fontStyle – массив с настройками шрифта, который будет использоваться для отображения текста. Полный список доступных настроек, Вы найдете на странице “Styles” в разделе “Font”, официальной документации.

$paragraphStyle – массив с настройками параграфа, или абзаца, в котором будет отображен текст. Полный список доступных настроек, Вы найдете на странице “Styles” в разделе “ Paragraph”, официальной документации.

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

$text = «PHPWord is a library written in pure PHP that provides a set of classes to write to and read from different document file formats.»;

$fontStyle = array(‘name’=>‘Arial’, ‘size’=>36, ‘color’=>‘075776’, ‘bold’=>TRUE, ‘italic’=>TRUE);

$parStyle = array(‘align’=>‘right’,‘spaceBefore’=>10);

$section>addText(htmlspecialchars($text), $fontStyle,$parStyle);

Настройки шрифта, использованные в примере:

name – имя шрифта;

size – размер шрифта;

color – цвет шрифта;

bold – если, true, будет использован жирный шрифт;

italic — если, true, будет использован курсив.

Настройки параграфа из примера:

align – выравнивание текста в параграфе, в нашем случае по правому краю;

spaceBefore – расстояние до параграфа.

Теперь давайте, непосредственно, создадим документ MS Word.

$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord,‘Word2007’);

$objWriter>save(‘doc.docx’);

Для создания документа, необходимо создать объект специального класса Word2007, используя статический метод createWriter(), класса IOFactory. Класс IOFactory – реализует шаблон проектирования Factory, и необходим для создания объектов других классов, имена которых мы передаем в качестве, второго параметра при вызове метода createWriter(). Далее вызывая метод save() и передавая в качестве первого параметра, имя будущего файла, мы формируем документ MS Word.

Как Вы видите, документ успешно создан. Если, не нужно создавать файл, а сформированный документ, необходимо отдать пользователю на скачивание, то при вызове метода save(), в качестве первого параметра, необходимо передать строку «php://output». При этом, так же, необходимо указать определенный набор заголовков.

header(«Content-Description: File Transfer»);

header(‘Content-Disposition: attachment; filename=»first.docx»‘);

header(‘Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document’);

header(‘Content-Transfer-Encoding: binary’);

header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’);

header(‘Expires: 0’);

$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, ‘Word2007’);

$objWriter>save(«php://output»);

Добавление списков

Для формирования списков, в будущем документе, необходимо использовать метод addListItem($text, [$depth], [$fontStyle], [$listStyle], [$paragraphStyle]), который за каждый свой вызов, формирует элемент списка. Параметры, которые необходимо передать при вызове метода:

$text – текст, элемента списка;

$depth – глубина вложенности. Если создается одноуровневый список, то данный параметр равен 0.

$fontStyle – массив настроек шрифта, по аналогии с добавлением простого текста.

$listStyle – массив настроек списка.

$paragraphStyle – массив настроек параграфа, по аналогии с добавлением текста.

Массив настроек списка $listStyle, поддерживает настройку – listType, то есть, тип списка, к примеру, нумерованный или же нет. В качестве значений, доступны специальные константы класса PhpOfficePhpWordStyleListItem:

TYPE_SQUARE_FILLED FILLED – не нумерованный список. В виде маркеров используются квадраты.

TYPE_BULLET_FILLED – не нумерованный список (значение по умолчанию). В виде маркеров используются точки.

TYPE_BULLET_EMPTY FILLED – не нумерованный список. В виде маркеров используются не закрашенные окружности.

TYPE_NUMBER – нумерованный список.

TYPE_NUMBER_NESTED – многоуровневый нумерованный список.

TYPE_ALPHANUM – нумерованный список, с использованием букв, в качестве маркеров.

Таким образом, следующий код, добавит одноуровневый нумерованный список в документ.

$fontStyle = array(‘name’ => ‘Times New Roman’, ‘size’ => 16,‘color’ => ‘075776’,‘italic’=>true);

$listStyle = array(‘listType’=>PhpOfficePhpWordStyleListItem::TYPE_BULLET_EMPTY);

$section>addListItem(‘Элемент 1’,0,$fontStyle,$listStyle);        

$section>addListItem(‘Элемент 2’,0,$fontStyle,$listStyle);        

$section>addListItem(‘Элемент 3’,0,$fontStyle,$listStyle);        

$section>addListItem(‘Элемент 4’,0,$fontStyle,$listStyle);        

$section>addListItem(‘Элемент 5’,0,$fontStyle,$listStyle);  

Добавление изображений

Для добавления изображений, необходимо использовать метод addImage($path,[$imgStyle]). При вызове данного метода, в качестве первого параметра, передается путь к изображению, которое необходимо добавить в документ. В качестве второго, необязательного параметра, можно передать массив с настройками отображения изображения. Полный список настроек изображения, Вы найдете на странице “Styles”, в разделе “ Image”.

Соответственно, давайте добавим изображение в создаваемый документ.

$section>addImage(‘picture.jpg’, array(

        ‘width’ => 100,

        ‘height’ => 100,

));

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

На этом данный урок я буду завершать. Как Вы видите, библиотека PHPWord, обладает огромнейшим функционалом и позволяет формировать документы MS Word различной сложности. Если она Вас заинтересовала, то изучайте более подробно официальную документацию, потому как мы с Вами рассмотрели только некоторые ее возможности. Всего Вам доброго и удачного кодирования!!!

Мы живем в мире, где PHP разработчикам приходится время от времени взаимодействовать с операционной системой Windows. WMI (Windows Management Interface, Интерфейс управления Windows) — один из таких примеров — взаимодействие с Microsoft Office.

В данной статье мы рассмотрим простую интеграцию между Word и PHP: генерацию документа Microsoft Word на основе полей ввода в HTML-форме с помощью PHP (и его расширения Interop).

Подготовительные шаги

Первым делом убедимся, что у нас настроено базовое окружение WAMP. Так как Interop присутствует только в Windows, то нам необходимо, чтобы наш сервер Apache и инсталляция PHP были развернуты на Windows машине. В этом качестве я использую EasyPHP 14.1, который крайне прост в установке и настройке.

Следующим делом необходимо установить Microsoft Office. Версия не очень важна. Я использую Microsoft Office 2013 Pro, но любая версия Office старше 2007 должна подойти.

Также необходимо убедиться, что у нас установлены библиотеки для разработки приложения Interop (PIA, Primary Interop Assemblies, Основные Сборки Interop). Узнать это можно открыв Проводник Windows, и перейдя в директорию <Windows Directory>assembly, и там мы должны увидеть набор установленных сборок:

Здесь можно увидеть элемент Microsoft.Office.Interop.Word (подчеркнут на скриншоте). Это будет та сборка, которую мы будем использовать в нашей демонстрации. Пожалуйста, обратите особое внимание на поля “Assembly name (Имя сборки)”, “Version (Версия)” и “Public key token (Токен публичного ключа)”. Их мы скоро будем использовать в нашем PHP скрипте.

В этой директории также присутствуют и другие сборки (включая и все семейство Office), доступные для использования в своих программах (не только для PHP, но также и для VB.net, C#, и т.д.).

Если список сборок не включает весь пакет Microsoft.Office.Interop, то нам нужно либо переустановить Office, добавив PIA, или вручную загрузить пакет с сайта Microsoft и установить его. Для более детальных инструкций обратитесь к этой странице на MSDN.

Замечание: к загрузке и установке доступен только дистрибутив PIA Microsoft Office 2010. Версия сборок в этом пакете 14.0.0, а 15 версия поставляется только с Office 2013.

И, наконец, необходимо включить расширение php_com_dotnet.dll в php.ini и перезапустить сервер.

Теперь можно перейти к программированию.

HTML форма

Так как основная часть данного примера ложится на серверную сторону, мы создадим простую страничку с формой, которая будет выглядеть следующим образом:

У нас есть текстовое поле для имени, группа переключателей для пола, слайдер для возраста, и область ввода текста для ввода сообщения, а также небезызвестная кнопка “Отправить”.

Сохраните этот файл как “index.html” в директории виртуального хоста, чтобы до него можно было добраться по адресу типа http://test/test/interop.

Серверная часть

Файл-обработчик на серверной стороне — это основная цель нашего разговора. Для начала я приведу полный код этого файла, а потом объясню его шаг за шагом.

<?php

$inputs = $_POST;
$inputs['printdate']='';
// Инициализация значения, чтобы избежать замечания от PHP о том, что в POST данных нет переменной “printdate”

$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
$class = 'Microsoft.Office.Interop.Word.ApplicationClass';

$w = new DOTNET($assembly, $class);
$w->visible = true;

$fn = __DIR__ . '\template.docx';

$d = $w->Documents->Open($fn);

echo "Документ открыт.<br><hr>";

$flds = $d->Fields;
$count = $flds->Count;
echo "В документе $count полей.<br>";
echo "<ul>";
$mapping = setupfields();

foreach ($flds as $index => $f)
{
    $f->Select();
    $key = $mapping[$index];
    $value = $inputs[$key];
    if ($key == 'gender')
    {
        if ($value == 'm')
            $value = 'Mr.';
        else
            $value = 'Ms.';
    }

    if($key=='printdate')
        $value=  date ('Y-m-d H:i:s');

    $w->Selection->TypeText($value);
    echo "<li>Назначаю полю $index: $key значение $value</li>";
}
echo "</ul>";

echo "Обработка завершена!<br><hr>";
echo "Печатаю, пожалуйста, подождите...<br>";

$d->PrintOut();
sleep(3);
echo "Готово!";

$w->Quit(false);
$w=null;

function setupfields()
{
    $mapping = array();
    $mapping[0] = 'gender';
    $mapping[1] = 'name';
    $mapping[2] = 'age';
    $mapping[3] = 'msg';
    $mapping[4] = 'printdate';


    return $mapping;
}

После того, как мы записали в переменную $inputs значения, полученные из формы, а также создали пустой элемент с ключом printdate (зачем мы это сделали — обсудим позже), мы переходим к четырем очень важным строкам:

$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
$class = 'Microsoft.Office.Interop.Word.ApplicationClass';

$w = new DOTNET($assembly, $class);
$w->visible = true;

Манипулятор COM в PHP требует создания экземпляра класса в рамках “сборки”. В нашем случае мы работаем с Word. Если взглянуть на первый скриншот, то можно записать полную сигнатуру сборки для Word:

  • “Name”, “Version”, “Public Key Token” — все это берется из информации, которую можно просмотреть в “c:Windowsassembly“.
  • “Culture” всегда neutrual

Класс, на который мы хотим ссылаться, всегда называется “имя.сборки”+ “.ApplicationClass“.

Установив два этих параметра мы сможем получить объект для работы с Word.

Этот объект может оставаться в фоне, или мы можем перевести его в рабочий режим установкой атрибута visible в true.

Следующим шагом открываем документ, требующий обработки, и записываем экземпляр “документа” в переменную $d.

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

Самым неправильным было бы жестко прописать содержимое документа в PHP, а потом вывести его в документ Word. Я настоятельно рекомендую этого не делать по следующим причинам:

  1. Вы теряете гибкость. Любые изменения в выходном файле потребуют изменения кода PHP.
  2. Это нарушает разделение управления и вида
  3. Применение стилей к содержимому документа (выравнивание, шрифты, стили, и т.д.) в скрипте сильно увеличит количество строк кода. Программное изменение стилей чересчур громоздко.

Другим вариантом будет использование поиска и замены. У PHP есть хорошие встроенные средства для этого. Мы можем создать документ Word, в котором разместим метки со специальными разделителями, которые в последствии будут заменены. Например, мы можем создать документ, который будет содержать следующий фрагмент:

а с помощью PHP мы легко можем заменить его на содержимое поля “Имя”, полученное с формы.

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

Я рекомендую третий способ, и он основывается на более глубоком знании Word. В качестве заполнителей мы будем использовать поля, а с помощью PHP кода будем непосредственно обновлять значения в полях соответствующими значениями.

Этот подход гибкий, быстрый, и согласуется с лучшими практиками работы с Word. С его помощью также можно избежать полнотекстового поиска в документе, что хорошо сказывается на производительности. Замечу, что у этого решения также есть недостатки.

Word с самого начала не поддерживал именные индексы для полей. Даже если мы и указали имена для создаваемых полей — нам все равно необходимо пользоваться числовыми идентификаторами этих полей. Это также объясняет, зачем нам нужно использовать отдельную функцию (setupfields) для того, чтобы задать соответствие индекса поля и имени поля из формы.

В этом демонстрационном уроке мы будем использовать документ с 5 полями MERGEFIELD. Шаблонный документ разместим там же, где и наш скрипт-обработчик.

Прошу заметить, что поле printdate не имеет соответствующего поля на форме. Вот зачем мы добавили пустой элемент printdate в массив $inputs. Без этого скрипт все же будет запускаться и работать, но PHP будет выдавать предупреждение, что индекс printdate отсутствует в массиве $inputs.

После замены полей новыми значениями мы отпечатаем документ с помощью

Метод PrintOut принимает несколько необязательных параметров, и мы используем самую простую его форму. Так будет отпечатана одна копия документа на принтере по умолчанию, который присоединен к Windows-машине.

Также можно вызвать PrintPreview, чтобы взглянуть на получившийся результат, прежде чем его отпечатать. В полностью автоматическом окружении мы, конечно же, будем использовать метод PrintOut.

Необходимо подождать некоторое время, прежде чем завершить работу с приложением Word, так нужно время на то чтобы поставить в очередь задание на печать. Без delay(3) метод $w->Quit выполняется незамедлительно, и задание не ставится в очередь.

Наконец, мы вызываем $w->Quit(false), что закрывает приложение Word, которое было вызвано нашим скриптом. Единственным параметром, передаваемым в метод, является указание сохранить файл перед выходом. Мы сделали правки в документе, но мы не хотим их сохранять, так как нам нужен чистый шаблон для последующей работы.

После того, как мы закончили с кодом, можем загрузить нашу страницу с формой, забить некоторые значения, и отправить её. Нижеприведенные изображения показывают результат работы скрипта, а также обновленный документ Word:

Улучшение скорости обработки и немного подробнее о PIA

PHP — слабо типизированный язык. Объект COM типа Object. Во время написания скрипта у нас нет возможности получить описание объекта, будь оно приложением Word, документом или полем. Мы не знаем, какие свойства есть у этого объекта, или какие он поддерживает методы.

Это сильно замедлит скорость разработки. Чтобы ускорить разработку, я бы рекомендовал писать функции сначала на C#, а после переводить код в PHP. Я могу рекомендовать бесплатную IDE для разработки на C# под названием “#develop”. Найти ее можно здесь. Я предпочитаю ее Visual Studio, так как #develop меньше, проще и быстрее.

Миграция C# кода в PHP не так страшна, как кажется. Давайте я покажу вам пару строк на C#:

Word.Application w=new Word.Application();
w.Visible=true;

String path=Application.StartupPath+"\template.docx";

Word.Document d=w.Documents.Open(path) as Word.Document;

Word.Fields flds=d.Fields;
int len=flds.Count;

foreach (Word.Field f in flds)
{
    f.Select();
    int i=f.Index;
    w.Selection.TypeText("...");
}

Можно заметить, что код на C# очень похож на код PHP, который я показывал ранее. C# — строго типизированный язык, так что в этом примере можно заметить несколько операторов приведения типов, а также переменным необходимо указывать тип.

С указанием типа переменной, можно наслаждаться более понятным кодом и автодополнением, и скорость разработки существенно повышается.

Другой способ повысить скорость разработки на PHP — вызывать макрос в Word. Мы проводим ту же последовательность действий, а после сохраняем ее как макрос. Макрос написан на Visual Basic, который также просто перевести в PHP.

И, что самое важное — документация по Office PIA от Microsoft, особенно документация по пространствам имен каждого приложения Office является самым детальным справочным материалом. Наиболее используемые три приложения:

  • Excel 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx
  • Word 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
  • PowerPoint 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx

Заключение

В этой статье мы показали, как заполнить данными документ Word с помощью библиотек PHP COM и возможностями взаимодействия Microsoft Office.

Windows и Office широко используются в повседневной жизни. Знать силу Office/Window и PHP будет полезно каждому PHP и Windows разработчику.

С помощью расширения PHP COM вам открывается дверь к использованию этой комбинации.

Конвертировать PHP to Word онлайн

Loading…

Обработка Пожалуйста, подождите…

Копировать текст

copy link

Копировать ссылку

copy link


send to email

Обработка Пожалуйста, подождите…

Файл отправлен на

clear email

Ваше мнение важно для нас, пожалуйста, оцените это приложение.





Спасибо за оценку нашего приложения!

PHP to Word conversion

Conholdate PHP to Word Conversion — это кроссплатформенное и кроссбраузерное приложение для конвертации, которое позволяет конвертировать PHP to Word в любом современном браузере (Chrome, Safari, Firefox, Opera, Tor и т. д.) и на любой ОС (Windows, Unix и MacOS), независимо от характеристик вашего ПК. Преобразованный PHP to Word сохранит исходную структуру, содержимое и стили документа. PHP to Word Приложение для конвертирования построено на основе высококачественного механизма преобразования документов, который обеспечивает выдающиеся результаты преобразования и производительность. Наша цель — предложить нашим пользователям безопасные и наилучшие возможности преобразования. Приложение Conholdate.Conversion предлагает функцию OCR, которая позволяет анализировать файлы изображений и экспортировать данные в документы Excel, например преобразовывать PNG в Excel.

Как Конвертировать PHP to Word

  1. Щелкните внутри области перетаскивания или перетащите файл.
  2. Подождите, пока файл PHP to Word не будет загружен.
  3. Выберите выходной формат из выпадающего меню.
  4. Нажмите кнопку Конвертировать, чтобы начать преобразование PHP to Word.
  5. Скачайте или поделитесь полученным файлом.

How to

часто задаваемые вопросы

Q: Как преобразовать файл PHP to Word?

A: Загрузите файл, перетащив его в зону загрузки или щелкните по нему, чтобы выбрать файл с помощью проводника. После этого выберите конечный формат, в который вы хотите преобразовать файл, и нажмите кнопку Преобразовать.

Q: Могу ли я извлечь таблицы из изображений (PNG) и экспортировать их в файлы Excel?

A: Да, это возможно. Преобразование Conholdate изображения в Excel будет анализировать файлы изображений с помощью функции OCR и извлекать текст и данные таблиц. Извлеченные данные можно сохранить в различных форматах, таких как Excel, OpenOffice и других.

Q: Сколько файлов можно конвертировать одновременно?

A: Вы можете конвертировать по 1 файлу за раз.

Q: Каков максимально допустимый размер файла?

A: Максимально допустимый размер файла для загрузки и конвертации составляет 20 МБ.

Q: Как получить результаты конвертирования файла?

A: В конце процесса преобразования вы получите ссылку для скачивания. Вы можете скачать результаты сразу или отправить ссылку на вашу электронную почту.

Q: Как многостраничный документ преобразуется в изображение?

A: Каждая страница такого документа будет сохранена как отдельное изображение. После завершения конвертации вы получите набор таких изображений.

Еще приложений

Еще conversion приложений

Выбрать язык

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

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

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

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

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

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

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

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

Пример договора-шаблона

Пример договора-шаблона

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

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

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

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

${variable}

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

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

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

Сохранение шаблона

Сохранение шаблона

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

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

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

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

require_once 'PHPWord.php';
$PHPWord = new PHPWord();
$document = $PHPWord->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'); //имя заполненного шаблона для сохранения

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

Заполненный шаблон

Заполненный шаблон

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

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

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

Запись опубликована в рубрике PHP. Добавьте в закладки постоянную ссылку.

Понравилась статья? Поделить с друзьями:
  • Данные проверка данных в excel чтобы на одном листе для других листов
  • Данные работники в excel
  • Данные работа с данными проверка данных в excel
  • Данные проверка данных в excel 365
  • Данные проверка данных в excel 2016