Microsoft word на php

PHPWord

Latest Stable Version
CI
Code Quality
Code Coverage
Total Downloads
License
Join the chat at https://gitter.im/PHPOffice/PHPWord

PHPWord is a library written in pure PHP that provides a set of classes to write to and read from different document file formats. The current version of PHPWord supports Microsoft Office Open XML (OOXML or OpenXML), OASIS Open Document Format for Office Applications (OpenDocument or ODF), Rich Text Format (RTF), HTML, and PDF.

PHPWord is an open source project licensed under the terms of LGPL version 3. PHPWord is aimed to be a high quality software product by incorporating continuous integration and unit testing. You can learn more about PHPWord by reading the Developers’ Documentation.

If you have any questions, please ask on StackOverFlow

Read more about PHPWord:

  • Features
  • Requirements
  • Installation
  • Getting started
  • Contributing
  • Developers’ Documentation

Features

With PHPWord, you can create OOXML, ODF, or RTF documents dynamically using your PHP scripts. Below are some of the things that you can do with PHPWord library:

  • Set document properties, e.g. title, subject, and creator.
  • Create document sections with different settings, e.g. portrait/landscape, page size, and page numbering
  • Create header and footer for each sections
  • Set default font type, font size, and paragraph style
  • Use UTF-8 and East Asia fonts/characters
  • Define custom font styles (e.g. bold, italic, color) and paragraph styles (e.g. centered, multicolumns, spacing) either as named style or inline in text
  • Insert paragraphs, either as a simple text or complex one (a text run) that contains other elements
  • Insert titles (headers) and table of contents
  • Insert text breaks and page breaks
  • Insert and format images, either local, remote, or as page watermarks
  • Insert binary OLE Objects such as Excel or Visio
  • Insert and format table with customized properties for each rows (e.g. repeat as header row) and cells (e.g. background color, rowspan, colspan)
  • Insert list items as bulleted, numbered, or multilevel
  • Insert hyperlinks
  • Insert footnotes and endnotes
  • Insert drawing shapes (arc, curve, line, polyline, rect, oval)
  • Insert charts (pie, doughnut, bar, line, area, scatter, radar)
  • Insert form fields (textinput, checkbox, and dropdown)
  • Create document from templates
  • Use XSL 1.0 style sheets to transform headers, main document part, and footers of an OOXML template
  • … and many more features on progress

Requirements

PHPWord requires the following:

  • PHP 7.1+
  • XML Parser extension
  • Laminas Escaper component
  • Zip extension (optional, used to write OOXML and ODF)
  • GD extension (optional, used to add images)
  • XMLWriter extension (optional, used to write OOXML and ODF)
  • XSL extension (optional, used to apply XSL style sheet to template )
  • dompdf library (optional, used to write PDF)

Installation

PHPWord is installed via Composer.
To add a dependency to PHPWord in your project, either

Run the following to use the latest stable version

composer require phpoffice/phpword

or if you want the latest unreleased version

composer require phpoffice/phpword:dev-master

Getting started

The following is a basic usage example of the PHPWord library.

<?php
require_once 'bootstrap.php';

// Creating the new document...
$phpWord = new PhpOfficePhpWordPhpWord();

/* Note: any element you append to a document must reside inside of a Section. */

// Adding an empty Section to the document...
$section = $phpWord->addSection();
// Adding Text element to the Section having font styled by default...
$section->addText(
    '"Learn from yesterday, live for today, hope for tomorrow. '
        . 'The important thing is not to stop questioning." '
        . '(Albert Einstein)'
);

/*
 * Note: it's possible to customize font style of the Text element you add in three ways:
 * - inline;
 * - using named font style (new font style object will be implicitly created);
 * - using explicitly created font style object.
 */

// Adding Text element with font customized inline...
$section->addText(
    '"Great achievement is usually born of great sacrifice, '
        . 'and is never the result of selfishness." '
        . '(Napoleon Hill)',
    array('name' => 'Tahoma', 'size' => 10)
);

// Adding Text element with font customized using named font style...
$fontStyleName = 'oneUserDefinedStyle';
$phpWord->addFontStyle(
    $fontStyleName,
    array('name' => 'Tahoma', 'size' => 10, 'color' => '1B2232', 'bold' => true)
);
$section->addText(
    '"The greatest accomplishment is not in never falling, '
        . 'but in rising again after you fall." '
        . '(Vince Lombardi)',
    $fontStyleName
);

// Adding Text element with font customized using explicitly created font style object...
$fontStyle = new PhpOfficePhpWordStyleFont();
$fontStyle->setBold(true);
$fontStyle->setName('Tahoma');
$fontStyle->setSize(13);
$myTextElement = $section->addText('"Believe you can and you're halfway there." (Theodor Roosevelt)');
$myTextElement->setFontStyle($fontStyle);

// Saving the document as OOXML file...
$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('helloWorld.docx');

// Saving the document as ODF file...
$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, 'ODText');
$objWriter->save('helloWorld.odt');

// Saving the document as HTML file...
$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, 'HTML');
$objWriter->save('helloWorld.html');

/* Note: we skip RTF, because it's not XML-based and requires a different example. */
/* Note: we skip PDF, because "HTML-to-PDF" approach is used to create PDF documents. */

More examples are provided in the samples folder. For an easy access to those samples launch php -S localhost:8000 in the samples directory then browse to http://localhost:8000 to view the samples.
You can also read the Developers’ Documentation for more detail.

Contributing

We welcome everyone to contribute to PHPWord. Below are some of the things that you can do to contribute.

  • Read our contributing guide.
  • Fork us and request a pull to the master branch.
  • Submit bug reports or feature requests to GitHub.
  • Follow @PHPWord and @PHPOffice on Twitter.

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

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

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

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

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля

Получить курс сейчас!

На данной странице, приведено краткое описание и инструкция по установке библиотеки. Но данная инструкция очень ограничена и не описывает всех возможностей библиотеки, поэтому, официальную 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 – размер нижней рамки;

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля

Получить курс сейчас!

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 программированию

Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля

Получить курс сейчас!

Разработка веб-приложения на PHP

Скачайте видеокурс и узнайте, как создать веб-приложение на PHP

Скачать

Мы живем в мире, где 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 вам открывается дверь к использованию этой комбинации.

Время на прочтение
2 мин

Количество просмотров 11K

Есть два основных способа построить Excel, Word, и PowerPoint используя PHP. Первый — используя библиотеку COM (только под Windows сервером) и другой — используя более стандартизированные форматы, такие как CSV и HTML.

Динамической создание Word документа:

<?php
$word = new COM("word.application");

$word->Visible = 0;
$word->Documents->Add();
$word->Selection->PageSetup->LeftMargin = '2"';
$word->Selection->PageSetup->RightMargin = '2"';

//Setup the font
$word->Selection->Font->Name = 'Verdana';
$word->Selection->Font->Size = 8;

//Write some text
$word->Selection->TypeText("This is a test document");
//Save the document as DOC file
$word->Documents[1]->SaveAs("c:\docs\test1.doc");

//quit and release COM resources
$word->quit();
$word->Release();
$word = null;

?>

Динамическое создание Excel документа:

<?php
$excel = new COM("excel.application");
$excel->Visible = 0;

//Create a new workbook
$wkb = $excel->Workbooks->Add();
$sheet = $wkb->Worksheets(1);

//This code adds the text 'myvalue' on row 2, column 4
$sheet->activate;
$cell = $sheet->Cells(2,4);
$cell->Activate;
$cell->value = 'myvalue';

$wkb->SaveAs("C:docstest.xls");

//close and free resources
$wkb->Close(false);
$excel->Workbooks->Close();
$excel->Quit();
?>

Динамическое создание презентации Powerpoint

<?php
$powerpnt = new COM("powerpoint.application");
//Creating a new presentation
$pres=$powerpnt->Presentations->Add();
//Adds the first slide. "12" means blank slide
$pres->Slides->Add(1,12);
//Adds another slide. "10" means a slide with a clipart and text
$pres->Slides->Add(2,10);
//Adds a textbox
$pres->Slides[1]->Shapes->AddTextbox(1,20,50,300,40);
//Save the document as PPT file
$powerpnt->Presentations[1]->SaveAs("C:Docstest1.ppt");

//free resources and quit powerpoint
$powerpnt->quit();
?>

Как найти функции Word, Excel, и Powerpoint

Текст далее рассказывает как найти функции работы с Microsoft Office components из-под PHP:

  1. Откройте Microsoft Word, Excel, или Powerpoint
  2. Нажмите Alt+F11 для того, что бы начать Visual Basic Editor
  3. Нажмите F2
  4. Найдите «ThisDocument» слева. В правом фрейме вы увидите возможные переменные и функции, которые могут быть использованы для COM объекта

На момент написания данной статьи релиз PHPWord датируется 8 июля 2011 года. Да еще бета версия. Конечно старовата, но с другой стороны, если класс хорошо выполняет поставленную задачу, то почему бы и нет?!

К делу: скачиваем, подключаем обычным инклюдом и вперед.

Создаем экземпляр класса:

$PHPWord = new PHPWord();

Необязательно, но можем добавить, что по-умолчанию используем шрифт Arial размером 14 пунктов.

$PHPWord->setDefaultFontName(‘Arial’);
$PHPWord->setDefaultFontSize(14);

Добавляем новый раздел в документ:

$section = $PHPWord->createSection([array $sectionStyle]);

По-умолчанию этот метод создает страницу A4 книжной ориентации. Поля: по 2,5 см верхнее, левое и правое и 2 см нижнее.

Массив $sectionStyle может содержать:

$sectionStyle = array(
    ‘orientation’ => ‘landscape’, // альбомная ориентация страницы
    ‘marginTop’ => ‘0’, // по-умолчанию равен 1418* и соответствует 2,5 см отступа сверху
    ‘marginLeft’ => ‘0’, // по-умолчанию равен 1418* и соответствует 2,5 см отступа слева
    ‘marginRight’ => ‘0’, // по-умолчанию равен 1418* и соответствует 2,5 см отступа справа
    ‘marginBottom’ => ‘0’, // по-умолчанию равен 1134* и соответствует 2 см отступа снизу
    ‘pageSizeW’ => ‘8419’, // по-умолчанию равен 11906* и соответствует 210 мм по ширине
    ‘pageSizeH’ => ‘11906’, // по-умолчанию равен 16838* и соответствует 297 мм по высоте
    ‘borderColor’=>’999999’, // Цвет ненужного бордюра
    ‘borderSize’=>’100’, // Ширина ненужного бордюра*
);

* В качестве единиц измерения тут используются типографские твипы. Для справки: 1 твип равен 1/567 см.

Текст

У нас есть пустая страница. Для начала добавим обычную текстовую строку. Для этого существует метод addText() и два синтаксиса:

$section->addText(string $text[, array $textStyle]);
// или
$section->addText(string $text[, string $fontStyleName[, string $paragraphStyleName]]);

На практике выглядит это так:

$section->addText(‘Создание сайтов — Лаборатории WEB’);

Тут стоит сделать замечание: автор PHPWord решил, что все, кто будет пользоваться его классом будут работать в кодировке отличной от UTF-8. Если просматривать код PHPWord, то там везде, как через мясорубку, все текстовые переменные проходят через utf8_encode(). Вот в моем случае это сыграло не на руку, потому что я как раз-то работаю с UTF-8.

Что делать, если вы тоже работаете с UTF-8? Варианта как минимум два:

  1. перед тем как отдать строки в PHPWord измените их кодировку на не UTF-8 с помощью iconv();
  2. прошерстите PHPWord и удалите все utf8_encode() оттуда.

Мной был выбран второй вариант.

Двигаемся дальше… Наведем «красоту» в тексте.

Первый вариант — это объявление всякой «красоты» непосредственно в методе addText().

$section->addText(‘Разработка сайтов — Лаборатория WEB’, array(
    ‘name’ => ‘Tahoma’,
    ‘color’ => ‘990000’,
    ‘bold’ => true,
    ‘italic’ => true,
    ‘size’ => 16,
));

Второй вариант — объединение набора «красот» в стиль.

$PHPWord->addFontStyle(‘fStyle’, array(
    ‘name’ => ‘Tahoma’,
    ‘color’ => ‘990000’,
    ‘bold’ => true,
    ‘italic’ => true,
    ‘size’ => 16,
));
$section->addText(‘Изготовление сайтов — Лаборатория WEB’, ‘fStyle’);

Сейчас был задан стиль для шрифта, но можно задать стиль и для параграфа:

$PHPWord->addParagraphStyle(‘pStyle’, array(
    ‘align’ => ‘center’,
    ‘spaceBefore’ => 100, // отступ сверху
    ‘spaceAfter’ => 100, // отступ снизу
    ‘spacing’ => 100, // межстрочный интервал
));

И использовать эти стили как совместно, так и по-отдельности:

$section->addText(‘Поддержка сайтов — Лаборатория WEB’, ‘fStyle’, ‘pStyle’);
// или
$section->addText(‘Продвижение сайтов — Лаборатория WEB’, null, ‘pStyle’);

Если вам нужно объединить в одном параграфе несколько текстовых блоков с разным форматированием, то для этого существует метод createTextRun():

$textrun = $section->createTextRun(‘pStyle’);
$textrun->addText(‘Жирный’, array(
    ‘bold’ => true
));
$textrun->addText(‘Курсив’, array(
    ‘italic’ => true
));
$textrun->addText(‘Красный’, array(
    ‘color’=>’990000’
));

С текстом, вроде, все ясно. Перенос курсора на следующую строку:

$section->addTextBreak([int $number]); // В скобках указывается количество строк на которое нужно перейти. По-умолчанию $number = 1

Изображения

Изображения вставляются также просто, как и текст. Для этого используется метод addImage():

$section->addImage(string $srcLocalImage[, array $imageStyle]);

Массив $imageStyle может содержать:

$imageStyle = array(
    ‘width’ => ‘200’, // в пикселях
    ‘height’ => ‘200’, // в пикселях
    ‘align’ => ‘center’, // left || right || center
)

На практике это выглядит так:

$section->addImage(‘path-to-image.png’, $imageStyle);

Ссылки

Метод для добавления ссылки addLink():

$section->addLink(string $url, [string $text[, string $linkFontStyle[, string $paragraphStyle]]]);

Наведение «красоты» для ссылки:

$PHPWord->addLinkStyle(‘lStyle’, array(
    ‘name’ => ‘Tahoma’,
    ‘color’ => ‘990000’,
    ‘bold’ => true,
    ‘italic’ => true,
    ‘size’ => 16,
));

На практике это выглядит:

$section->addLink(‘http://www.w-lab.ru’, ‘Лаборатория WEB’, ‘lStyle’, ‘pStyle’);

Таблицы

С таблицами немного сложнее. Для добавления таблицы на страницу используем метод addTable(). Как и в случае с текстом, для таблиц существует два синтаксиса. Первый выглядит так:

$table = $section->addTable([array $tableStyle]);

Массив $tableStyle может содержать:

$tableStyle = array(
    ‘cellMarginTop’ => 0, // отступ от ячейки сверху *
    ‘cellMarginRight’ => 0, // отступ от ячейки справа *
    ‘cellMarginBottom’ => 0, // отступ от ячейки снизу *
    ‘cellMarginLeft’ => 0, // отступ от ячейки слева *
);

* в твипах.

cellMarginTop, cellMarginRight, cellMarginBottom, cellMarginLeft можно заменить одним cellMargin.

Второй синтаксис:

$table = $section->addTable([string $tableStyleName]);

Для того, чтобы назначить $tableStyleName, вызовем метод addTableStyle():

$PHPWord->addTableStyle(string $styleName, array $tableStyle[, array $firstRowTableStyle]);

Как можно понять из названия, массив $firstRowTableStyle отвечает за стили первой строки таблицы.

На практике:

$word->addTableStyle(‘tStyle’,  array(
    ‘borderSize’ => 6,
    ‘borderColor’ => ‘999999’,
    ‘cellMarginTop’ => 40,
    ‘cellMarginRight’ => 20,
    ‘cellMarginBottom’ => 40,
    ‘cellMarginLeft’ => 20,
), array(
    ‘borderSize’ => 12,
    ‘borderColor’ => ‘000000’,
    ‘cellMargin’ => 80,
));
$table = $section->addTable(‘tStyle’);

Тут мы назначили для ячеек всей таблицы ширину границы 6, цвет серый, с отступами 40 20 40 20. А для ячеек первой строки ширину границы 12, черного цвета с отступами 80 со всех сторон.

Теперь в таблицу нужно добавить строку. Для этого существует метод addRow():

$table->addRow([int $rowHeight]); // $rowHeight — высота строки в твипах

И методом addCell() добавляем ячейку:

$cell = $table->addCell(int $cellWidth[, array $cellStyle]);

Здесь $cellWidth — ширина ячейки в твипах, а массив $cellStyle может содержать:

$cellStyle = array(
    ‘valign’ => ‘center’, // top || bottom || center || both
    ‘textDirection’ => PHPWord_Style_Cell:TEXT_DIR_BTLR, // PHPWord_Style_Cell:TEXT_DIR_BTLR || PHPWord_Style_Cell:TEXT_DIR_TBRL
    ‘bgColor’ => ‘fafafa’,
    ‘borderTopSize’ => 6,
    ‘borderRightSize’ => 6,
    ‘borderBottomSize’ => 6,
    ‘borderLeftSize’ => 6,
    ‘borderSize’ => 6, // вместо borderTopSize, borderRightSize, borderBottomSize, borderLeftSize
    ‘borderTopColor’ => ‘999999’,
    ‘borderRightColor’ => ‘999999’,
    ‘borderBottomColor’ => ‘999999’,
    ‘borderLeftColor’ => ‘999999’,
    ‘borderColor’ => ‘999999’, // вместо borderTopColor, borderRightColor, borderBottomColor, borderLeftColor
);

Последнее, что нужно сделать — это добавить содержимое в новую ячейку (добавим текст). Сделать это можно двумя способами:

$cell = $table->addCell();
$cell->addText(‘Создание Langing Page — Лаборатория WEB’);
// или
$table->addCell()->addText(‘Разработка Langing Page — Лаборатория WEB’);

Списки

Добавление на страницу нумерованных и ненумерованных списков осуществляется методом addListItem():

$section->addListItem(string $text[, int $depth[, string $textStyle[, array $listStyle[, string $paragraphStyle]]]]);

Здесь $depth — глубина (вложенность) списка от 1 до 9, а массив $listType может состоять из:

$listType = array(
    ‘listType’ => PHPWord_Style_ListItem:TYPE_NUMBER, // одноуровневый нумерованный список
);

Также параметр ‘listType’ может принимать следующие значения:

  • PHPWord_Style_ListItem:TYPE_NUMBER_NESTED — многоуровневый нумерованный список;
  • PHPWord_Style_ListItem:TYPE_BULLET_FILLED — ненумерованный список с маркерами в виде закрашенных кругов;
  • PHPWord_Style_ListItem:TYPE_BULLET_EMPTY — ненумерованный список с маркерами в виде незакрашенных кругов;
  • PHPWord_Style_ListItem:TYPE_SQUARE_FILLED — ненумерованный список с маркерами в виде закрашенных квадратов.

Колонтитулы

При работе с колонтитулами нужно помнить, что они привязываются к разделу и выглядят одинаково на всех страницах, относящихся к одному и тому же разделу.

Создадим верхний и нижний колонтитулы и добавим в них содержимое:

$header = $section->createHeader();
$header->addText(‘Лаборатория WEB’);

$footer = $section->createFooter();
$footer->addPreserveText(‘Страница {PAGE} из {NUMPAGES}’, array(
    ‘italic’ => true,
),
array(
    ‘align’ => ‘right’,
));

Метод addPreserveText() существует специально для добавления номеров страниц.

Разное

$section->addPageBreak(); // Разрыв страницы

Метаданные:

$meta = $PHPWord->getProperties();
$meta->setTitle(‘Название’);
$meta->setSubject(‘Тема’);
$meta->setCreator(‘Автор’);
$meta->setCompany(‘Учреждение’);
$meta->setDescription(‘Заметки’);
$meta->setCategory(‘Группа’);
$meta->setLastModifiedBy(‘Автор изменений’);
$meta->setKeywords(‘Ключевые слова’);
$meta->setCreated(time()); // Дата и время создания документа
$meta->setModified(time()); //Дата и время последнего изменения документа

Сохранение файлов

В файл на жесткий:

$writer = PHPWord_IOFactory::createWriter($PHPWord, ‘Word2007’);
$writer->save(‘document.docx’);

Вывод вопроса на скачивание:

header(«Content-Type: application/msword»);
header(«Content-Transfer-Encoding: binary»);
header(‘Content-Disposition: attachment;filename=»document.docx»‘);
header(‘Cache-Control: max-age=0’);
$writer = PHPWord_IOFactory::createWriter($PHPWord, ‘Word2007’);
$writer->save(‘php://output’);

Понравилась статья? Поделить с друзьями:
  • Microsoft word на 1 раз
  • Microsoft word мощный текстовый редактор предназначенный для выполнения всех процессов
  • Microsoft word мод скачать
  • Microsoft word мобильная версия
  • Microsoft word меняем шрифты