Phpword MANUAL
Phpword MANUAL
Phpword MANUAL
Release 0.18.2
1 Introduction 3
1.1 Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 File formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Contributing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Installing/configuring 7
2.1 Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Using samples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 General usage 9
3.1 Basic example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 PHPWord Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Document settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4 Document information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.5 Measurement units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.6 Document protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.7 Automatically Recalculate Fields on Open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.8 Hyphenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4 Containers 15
4.1 Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.3 Footers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.4 Other containers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5 Elements 19
5.1 Texts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2 Breaks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.3 Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.4 Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.5 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.6 Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.7 Table of contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.8 Footnotes & endnotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.9 Checkboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.10 Textboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
i
5.11 Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.12 Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.13 Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.14 Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.15 Track Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6 Styles 29
6.1 Section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2 Font . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6.3 Paragraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6.4 Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.5 Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.6 Numbering level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.7 Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7 Templates processing 35
7.1 setValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.2 setValues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.3 setImageValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.4 cloneBlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
7.5 replaceBlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.6 deleteBlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.7 cloneRow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.8 cloneRowAndSetValues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.9 applyXslStyleSheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.10 setComplexValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.11 setComplexBlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.12 setChartValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.13 save . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.14 saveAs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
9 Recipes 45
9.1 Create float left image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
9.2 Download the produced file automatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
9.3 Create numbered headings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
9.4 Add a link within a title . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
9.5 Remove [Compatibility Mode] text in the MS Word title bar . . . . . . . . . . . . . . . . . . . . . . 46
11 Credits 51
12 References 53
12.1 ISO/IEC 29500, Third edition, 2012-09-01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
ii
12.2 Formal specifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
12.3 Other resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
iii
iv
PHPWord Documentation, Release 0.18.2
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), and Rich Text Format (RTF).
Contents 1
PHPWord Documentation, Release 0.18.2
2 Contents
CHAPTER 1
Introduction
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), and Rich Text Format (RTF).
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 this Developers’ Documentation and the API Documentation.
1.1 Features
3
PHPWord Documentation, Release 0.18.2
1.2.1 Writers
4 Chapter 1. Introduction
PHPWord Documentation, Release 0.18.2
1.2.2 Readers
1.3 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 develop branch.
• Submit bug reports or feature requests to GitHub.
• Follow @PHPWord and @PHPOffice on Twitter.
1.3. Contributing 5
PHPWord Documentation, Release 0.18.2
6 Chapter 1. Introduction
CHAPTER 2
Installing/configuring
2.1 Requirements
Mandatory:
• PHP 5.3.3+
• XML Parser extension
• Laminas Escaper component
Optional:
• Zip extension
• GD extension
• XMLWriter extension
• XSL extension
• dompdf library
2.2 Installation
PHPWord is installed via Composer. You just need to add dependency on PHPWord into your package.
Example:
{
"require": {
"phpoffice/phpword": "v0.18.*"
}
}
7
PHPWord Documentation, Release 0.18.2
If you are a developer or if you want to help us with testing then fetch the latest branch for developers. Notice: all
contributions must be done against the developer branch.
Example:
{
"require": {
"phpoffice/phpword": "dev-develop"
}
}
More examples are provided in the samples directory. 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.
8 Chapter 2. Installing/configuring
CHAPTER 3
General usage
The following is a basic example of the PHPWord library. More examples are provided in the samples folder.
<?php
require_once 'bootstrap.php';
/* Note: any element you append to a document must reside inside of a Section. */
/*
* 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.
*/
9
PHPWord Documentation, Release 0.18.2
// 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...
$myTextElement->setFontStyle($fontStyle);
/* 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.
˓→*/
The PhpOffice\PhpWord\Settings class provides some options that will affect the behavior of PHPWord.
Below are the options.
This option sets XMLWriter::setIndent and XMLWriter::setIndentString. The default value of this option is true
(compatible), which is required for OpenOffice to render OOXML document correctly. You can set this option to
false during development to make the resulting XML file easier to read.
\PhpOffice\PhpWord\Settings::setCompatibility(false);
By default, PHPWord uses Zip extension to deal with ZIP compressed archives and files inside them. If you can’t
have Zip extension installed on your server, you can use pure PHP library alternative, PclZip, which is included in
PHPWord.
\PhpOffice\PhpWord\Settings::setZipClass(\PhpOffice\PhpWord\Settings::PCLZIP);
Writing documents of some formats, especially XML-based, requires correct output escaping. Without it your docu-
ment may become broken when you put special characters like ampersand, quotes, and others in it.
Escaping can be performed in two ways: outside of the library by a software developer and inside of the library by
built-in mechanism. By default, the built-in mechanism is disabled for backward compatibility with versions prior to
v0.13.0. To turn it on set outputEscapingEnabled option to true in your PHPWord configuration file or use
the following instruction at runtime:
\PhpOffice\PhpWord\Settings::setOutputEscapingEnabled(true);
By default, all sections of the document will print on A4 paper. You can alter the default paper by using the following
function:
\PhpOffice\PhpWord\Settings::setDefaultPaper('Letter');
By default, every text appears in Arial 10 point. You can alter the default font by using the following two functions:
The default zoom value is 100 percent. This can be changed either to another percentage
$phpWord->getSettings()->setZoom(75);
$phpWord->getSettings()->setZoom(Zoom::BEST_FIT);
Use mirror margins to set up facing pages for double-sided documents, such as books or magazines.
$phpWord->getSettings()->setMirrorMargins(true);
By default spelling and grammatical errors are shown as soon as you open a word document. For big documents this
can slow down the opening of the document. You can hide the spelling and/or grammatical errors with:
$phpWord->getSettings()->setHideGrammaticalErrors(true);
$phpWord->getSettings()->setHideSpellingErrors(true);
You can also specify the status of the spell and grammar checks, marking spelling or grammar as dirty will force a
re-check when opening the document.
$phpWord->getSettings()->setProofState(proofState);
Track changes can be activated using setTrackRevisions, you can furture specify
• Not to use move syntax, instead moved items will be seen as deleted in one place and added in another
• Not track formatting revisions
$phpWord->getSettings()->setTrackRevisions(true);
$phpWord->getSettings()->setDoNotTrackMoves(true);
$phpWord->getSettings()->setDoNotTrackFormatting(true);
The default symbol to represent a decimal figure is the . in english. In french you might want to change it to , for
instance.
$phpWord->getSettings()->setDecimalSymbol(',');
The default language of the document can be change with the following.
$phpWord->getSettings()->setThemeFontLang(new Language(Language::FR_BE));
Language has 3 parameters, one for Latin languages, one for East Asian languages and one
for Complex (Bi-Directional) languages. A couple of language codes are provided in the
PhpOffice\PhpWord\Style\Language class but any valid code/ID can be used.
In case you are generating an RTF document the language need to be set differently.
You can set the document information such as title, creator, and company name. Use the following functions:
$properties = $phpWord->getDocInfo();
$properties->setCreator('My name');
$properties->setCompany('My factory');
$properties->setTitle('My title');
$properties->setDescription('My description');
$properties->setCategory('My category');
$properties->setLastModifiedBy('My name');
$properties->setCreated(mktime(0, 0, 0, 3, 12, 2014));
$properties->setModified(mktime(0, 0, 0, 3, 14, 2014));
$properties->setSubject('My subject');
$properties->setKeywords('my, key, word');
The base length unit in Open Office XML is twip. Twip means “TWentieth of an Inch Point”, i.e. 1 twip = 1/1440
inch.
You can use PHPWord helper functions to convert inches, centimeters, or points to twip.
$section = $phpWord->addSection();
$sectionStyle = $section->getStyle();
// half inch left margin
$sectionStyle->setMarginLeft(\PhpOffice\PhpWord\Shared\Converter::inchToTwip(.5));
// 2 cm right margin
$sectionStyle->setMarginRight(\PhpOffice\PhpWord\Shared\Converter::cmToTwip(2));
$documentProtection = $phpWord->getSettings()->getDocumentProtection();
$documentProtection->setEditing(DocProtect::READ_ONLY);
$documentProtection->setPassword('myPassword');
To force an update of the fields present in the document, set updateFields to true
$phpWord->getSettings()->setUpdateFields(true);
3.8 Hyphenation
Hyphenation describes the process of breaking words with hyphens. There are several options to control hyphenation.
$phpWord->getSettings()->setAutoHyphenation(true);
The maximum number of consecutive lines of text ending with a hyphen can be controlled by the
consecutiveHyphenLimit option. There is no limit if the option is not set or the provided value is 0.
$phpWord->getSettings()->setConsecutiveHyphenLimit(2);
The hyphenation zone (in twip) is the allowed amount of whitespace before hyphenation is applied. The smaller the
hyphenation zone the more words are hyphenated. Or in other words, the wider the hyphenation zone the less words
are hyphenated.
$phpWord->getSettings()->
˓→setHyphenationZone(\PhpOffice\PhpWord\Shared\Converter::cmToTwip(1));
To control whether or not words in all capital letters shall be hyphenated use the doNotHyphenateCaps option.
$phpWord->getSettings()->setDoNotHyphenateCaps(true);
Containers
Containers are objects where you can put elements (texts, lists, tables, etc). There are 3 main containers, i.e. sections,
headers, and footers. There are 3 elements that can also act as containers, i.e. textruns, table cells, and footnotes.
4.1 Sections
Every visible element in word is placed inside of a section. To create a section, use the following code:
$section = $phpWord->addSection($sectionStyle);
The $sectionStyle is an optional associative array that sets the section. Example:
$sectionStyle = array(
'orientation' => 'landscape',
'marginTop' => 600,
'colsNum' => 2,
);
You can change a section page number by using the pageNumberingStart style of the section.
// Method 1
$section = $phpWord->addSection(array('pageNumberingStart' => 1));
// Method 2
$section = $phpWord->addSection();
$section->getStyle()->setPageNumberingStart(1);
15
PHPWord Documentation, Release 0.18.2
4.1.2 Multicolumn
You can change a section layout to multicolumn (like in a newspaper) by using the breakType and colsNum style
of the section.
// Method 1
$section = $phpWord->addSection(array('breakType' => 'continuous', 'colsNum' => 2));
// Method 2
$section = $phpWord->addSection();
$section->getStyle()->setBreakType('continuous');
$section->getStyle()->setColsNum(2);
You can apply line numbering to a section by using the lineNumbering style of the section.
// Method 1
$section = $phpWord->addSection(array('lineNumbering' => array()));
// Method 2
$section = $phpWord->addSection();
$section->getStyle()->setLineNumbering(array());
4.2 Headers
Each section can have its own header reference. To create a header use the addHeader method:
$header = $section->addHeader();
Be sure to save the result in a local object. You can use all elements that are available for the footer. See “Footer”
section for detail. Additionally, only inside of the header reference you can add watermarks or background pictures.
See “Watermarks” section.
You can pass an optional parameter to specify where the header/footer should be applied, it can be
• Footer::AUTO default, all pages except if overridden by first or even
• Footer::FIRST each first page of the section
• Footer::EVEN each even page of the section. Will only be applied if the evenAndOddHeaders is set to true
in phpWord->settings
To change the evenAndOddHeaders use the getSettings method to return the Settings object, and then call the
setEvenAndOddHeaders method:
16 Chapter 4. Containers
PHPWord Documentation, Release 0.18.2
$phpWord->getSettings()->setEvenAndOddHeaders(true);
4.3 Footers
Each section can have its own footer reference. To create a footer, use the addFooter method:
$footer = $section->addFooter();
Be sure to save the result in a local object to add elements to a footer. You can add the following elements to footers:
• Texts addText and createTextrun
• Text breaks
• Images
• Tables
• Preserve text
See the “Elements” section for the detail of each elements.
Textruns, table cells, and footnotes are elements that can also act as containers. See the corresponding “Elements”
section for the detail of each elements.
4.3. Footers 17
PHPWord Documentation, Release 0.18.2
18 Chapter 4. Containers
CHAPTER 5
Elements
Below are the matrix of element availability in each container. The column shows the containers while the rows lists
the elements.
19
PHPWord Documentation, Release 0.18.2
3 Link v v v v v v
4 Title v ? ? ? ? ?
5 Preserve ? v v v* • •
Text
6 Text Break v v v v v v
7 Page Break v • • • • •
8 List v v v v • •
9 Table v v v v • •
10 Image v v v v v v
11 Watermark • v • • • •
12 OLEObject v v v v v v
13 TOC v • • • • •
16 CheckBox v v v v v •
17 TextBox v v v v • •
18 Field v v v v v v
19 Line v v v v v v
20 Chart v v
Legend:
• v. Available.
• v*. Available only when inside header/footer.
• v**. Available only when inside section.
• -. Not available.
• ?. Should be available.
5.1 Texts
Text can be added by using addText and addTextRun methods. addText is used for creating simple paragraphs
that only contain texts with the same style. addTextRun is used for creating complex paragraphs that contain text
20 Chapter 5. Elements
PHPWord Documentation, Release 0.18.2
with different style (some bold, other italics, etc) or other elements, e.g. images or links. The syntaxes are as follow:
5.1.1 Titles
If you want to structure your document or build table of contents, you need titles or headings. To add a title to the
document, use the addTitleStyle and addTitle method. If depth is 0, a Title will be inserted, otherwise a
Heading1, Heading2, . . .
• depth.
• $fontStyle. See Font.
• $paragraphStyle. See Paragraph.
• $text. Text to be displayed in the document. This can be string or a PhpOfficePhpWordElementTextRun
It’s necessary to add a title style to your document because otherwise the title won’t be detected as a real title.
5.1.2 Links
You can add Hyperlinks to the document by using the function addLink:
The addPreserveText method is used to add a page number or page count to headers or footers.
5.1. Texts 21
PHPWord Documentation, Release 0.18.2
5.2 Breaks
Text breaks are empty new lines. To add text breaks, use the following syntax. All parameters are optional.
There are two ways to insert a page break, using the addPageBreak method or using the pageBreakBefore
style of paragraph.
$section->addPageBreak();
5.3 Lists
Lists can be added by using addListItem and addListItemRun methods. addListItem is used for creating
lists that only contain plain text. addListItemRun is used for creating complex list items that contains texts with
different style (some bold, other italics, etc) or other elements, e.g. images or links. The syntaxes are as follow:
Basic usage:
Parameters:
• $text. Text that appears in the document.
• $depth. Depth of list item.
• $fontStyle. See Font.
• $listStyle. List style of the current element TYPE_NUMBER, TYPE_ALPHANUM,
TYPE_BULLET_FILLED, etc. See list of constants in PHPWord\Style\ListItem.
• $paragraphStyle. See Paragraph.
See Sample_09_Tables.php for more code sample.
Advanced usage:
You can also create your own numbering style by changing the $listStyle parameter with the name of your
numbering style.
22 Chapter 5. Elements
PHPWord Documentation, Release 0.18.2
$phpWord->addNumberingStyle(
'multilevel',
array(
'type' => 'multilevel',
'levels' => array(
array('format' => 'decimal', 'text' => '%1.', 'left' => 360, 'hanging' =>
˓→360, 'tabPos' => 360),
array('format' => 'upperLetter', 'text' => '%2.', 'left' => 720, 'hanging
˓→' => 360, 'tabPos' => 720),
)
)
);
$section->addListItem('List Item I', 0, null, 'multilevel');
$section->addListItem('List Item I.a', 1, null, 'multilevel');
$section->addListItem('List Item I.b', 1, null, 'multilevel');
$section->addListItem('List Item II', 0, null, 'multilevel');
5.4 Tables
To add tables, rows, and cells, use the addTable, addRow, and addCell methods:
$table = $section->addTable([$tableStyle]);
$table->addRow([$height], [$rowStyle]);
$cell = $table->addCell($width, [$cellStyle]);
$tableStyle = array(
'borderColor' => '006699',
'borderSize' => 6,
'cellMargin' => 50
);
$firstRowStyle = array('bgColor' => '66BBFF');
$phpWord->addTableStyle('myTable', $tableStyle, $firstRowStyle);
$table = $section->addTable('myTable');
You can span a cell on multiple columns by using gridSpan or multiple rows by using vMerge.
$cell = $table->addCell(200);
$cell->getStyle()->setGridSpan(5);
5.5 Images
To add an image, use the addImage method to sections, headers, footers, textruns, or table cells.
5.4. Tables 23
PHPWord Documentation, Release 0.18.2
$section->addImage($src, [$style]);
• $src. String path to a local image, URL of a remote image or the image data, as a string. Warning: Do not pass
user-generated strings here, as that would allow an attacker to read arbitrary files or perform server-side request
forgery by passing file paths or URLs instead of image data.
• $style. See Image.
Examples:
$section = $phpWord->addSection();
$section->addImage(
'mars.jpg',
array(
'width' => 100,
'height' => 100,
'marginTop' => -1,
'marginLeft' => -1,
'wrappingStyle' => 'behind'
)
);
$footer = $section->addFooter();
$footer->addImage('http://example.com/image.php');
$textrun = $section->addTextRun();
$textrun->addImage('http://php.net/logo.jpg');
$source = file_get_contents('/path/to/my/images/earth.jpg');
$textrun->addImage($source);
5.5.1 Watermarks
To add a watermark (or page background image), your section needs a header reference. After creating a header, you
can use the addWatermark method to add a watermark.
$section = $phpWord->addSection();
$header = $section->addHeader();
$header->addWatermark('resources/_earth.jpg', array('marginTop' => 200, 'marginLeft'
˓→=> 55));
5.6 Objects
You can add OLE embeddings, such as Excel spreadsheets or PowerPoint presentations to the document by using
addOLEObject method.
$section->addOLEObject($src, [$style]);
To add a table of contents (TOC), you can use the addTOC method. Your TOC can only be generated if you have add
at least one title (See “Titles”).
24 Chapter 5. Elements
PHPWord Documentation, Release 0.18.2
You can create footnotes with addFootnote and endnotes with addEndnote in texts or textruns, but it’s rec-
ommended to use textrun to have better layout. You can use addText, addLink, addTextBreak, addImage,
addOLEObject on footnotes and endnotes.
On textrun:
$textrun = $section->addTextRun();
$textrun->addText('Lead text.');
$footnote = $textrun->addFootnote();
$footnote->addText('Footnote text can have ');
$footnote->addLink('http://test.com', 'links');
$footnote->addText('.');
$footnote->addTextBreak();
$footnote->addText('And text break.');
$textrun->addText('Trailing text.');
$endnote = $textrun->addEndnote();
$endnote->addText('Endnote put at the end');
On text:
$section->addText('Lead text.');
$footnote = $section->addFootnote();
$footnote->addText('Footnote text.');
By default the footnote reference number will be displayed with decimal number starting from 1. This number uses the
FooterReference style which you can redefine with the addFontStyle method. Default value for this style is
array('superScript' => true);
The footnote numbering can be controlled by setting the FootnoteProperties on the Section.
$fp = new \PhpOffice\PhpWord\ComplexType\FootnoteProperties();
//sets the position of the footnote (pageBottom (default), beneathText, sectEnd,
˓→docEnd)
$fp->setPos(\PhpOffice\PhpWord\ComplexType\FootnoteProperties::POSITION_BENEATH_TEXT);
//set the number format to use (decimal (default), upperRoman, upperLetter, ...)
$fp->setNumFmt(\PhpOffice\PhpWord\SimpleType\NumberFormat::LOWER_ROMAN);
//force starting at other than 1
(continues on next page)
5.9 Checkboxes
5.10 Textboxes
To be completed
5.11 Fields
//or a 'TextRun', to be able to format the text you want in the index
$fieldText = new TextRun();
(continues on next page)
26 Chapter 5. Elements
PHPWord Documentation, Release 0.18.2
5.12 Line
$lineStyle = array('weight' => 1, 'width' => 100, 'height' => 0, 'color' => 635552);
$section->addLine($lineStyle);
5.13 Chart
5.14 Comments
Comments can be added to a document by using addComment. The comment can contain formatted text. Once the
comment has been added, it can be linked to any element with setCommentStart.
5.12. Line 27
PHPWord Documentation, Release 0.18.2
$textrun = $section->addTextRun();
$textrun->addText('This ');
$text = $textrun->addText('is');
// link the comment to the text you just created
$text->setCommentStart($comment);
If no end is set for a comment using the setCommentEnd, the comment will be ended automatically at the end of
the element it is started on.
Track changes can be set on text elements. There are 2 ways to set the change information on an element. Either by
calling the setChangeInfo(), or by setting the TrackChange instance on the element with setTrackChange().
$text = $textRun->addText('up');
$text->setTrackChange(new TrackChange(TrackChange::INSERTED, 'Fred'));
28 Chapter 5. Elements
CHAPTER 6
Styles
6.1 Section
29
PHPWord Documentation, Release 0.18.2
6.2 Font
6.3 Paragraph
30 Chapter 6. Styles
PHPWord Documentation, Release 0.18.2
6.4 Table
6.4. Table 31
PHPWord Documentation, Release 0.18.2
• unit. The unit to use for the width. One of \PhpOffice\PhpWord\SimpleType\TblWidth. Defaults
to auto.
• layout. Table layout, either fixed or autofit See \PhpOffice\PhpWord\Style\Table for constants.
• cellSpacing Cell spacing in twip
• position Floating Table Positioning, see below for options
• bidiVisual Present table as Right-To-Left
Floating Table Positioning options:
• leftFromText Distance From Left of Table to Text in twip
• rightFromText Distance From Right of Table to Text in twip
• topFromText Distance From Top of Table to Text in twip
• bottomFromText Distance From Top of Table to Text in twip
• vertAnchor Table Vertical Anchor, one of \PhpOffice\PhpWord\Style\TablePosition::VANCHOR_*
• horzAnchor Table Horizontal Anchor, one of \PhpOffice\PhpWord\Style\TablePosition::HANCHOR_*
• tblpXSpec Relative Horizontal Alignment From Anchor, one of \PhpOffice\PhpWord\Style\TablePosition::XAL
• tblpX Absolute Horizontal Distance From Anchorin twip
• tblpYSpec Relative Vertical Alignment From Anchor, one of \PhpOffice\PhpWord\Style\TablePosition::YALIG
• tblpY Absolute Vertical Distance From Anchorin twip
Available Row style options:
• cantSplit. Table row cannot break across pages, true or false.
• exactHeight. Row height is exact or at least.
• tblHeader. Repeat table row on every new page, true or false.
Available Cell style options:
• bgColor. Background color, e.g. ‘9966CC’.
• border(Top|Right|Bottom|Left)Color. Border color, e.g. ‘9966CC’.
• border(Top|Right|Bottom|Left)Size. Border size in twip.
• border(Top|Right|Bottom|Left)Style. Border style. You can use constants from
\PhpOffice\PhpWord\SimpleType\Border
• gridSpan. Number of columns spanned.
• textDirection(btLr|tbRl). Direction of text. You can use con-
stants \PhpOffice\PhpWord\Style\Cell::TEXT_DIR_BTLR and
\PhpOffice\PhpWord\Style\Cell::TEXT_DIR_TBRL
• valign. Vertical alignment, top, center, both, bottom.
• vMerge. restart or continue.
• width. Cell width in twip.
32 Chapter 6. Styles
PHPWord Documentation, Release 0.18.2
6.5 Image
6.7 Chart
6.5. Image 33
PHPWord Documentation, Release 0.18.2
34 Chapter 6. Styles
CHAPTER 7
Templates processing
You can create an OOXML document template with included search-patterns (macros) which can be replaced by any
value you wish. Only single-line values can be replaced. Macros are defined like this: ${search-pattern}. To
load a template file, create a new instance of the TemplateProcessor.
7.1 setValue
The following will replace ${firstname} with John, and ${lastname} with Doe . The resulting document
will now contain Hello John Doe!
$templateProcessor->setValue('firstname', 'John');
$templateProcessor->setValue('lastname', 'Doe');
7.2 setValues
You can also set multiple values by passing all of them in an array.
7.3 setImageValue
35
PHPWord Documentation, Release 0.18.2
• ${search-image-pattern}
• ${search-image-pattern:[width]:[height]:[ratio]}
• ${search-image-pattern:[width]x[height]}
• ${search-image-pattern:size=[width]x[height]}
• ${search-image-pattern:width=[width]:height=[height]:ratio=false}
Where:
• [width] and [height] can be just numbers or numbers with measure, which supported by Word (cm, mm,
in, pt, pc, px, %, em, ex)
• [ratio] uses only for false, - or f to turn off respect aspect ration of image. By default template image
size uses as ‘container’ size.
Example:
${CompanyLogo}
${UserLogo:50:50} ${Name} - ${City} - ${Street}
$templateProcessor->setImageValue('CompanyLogo', 'path/to/company/logo.png');
$templateProcessor->setImageValue('UserLogo', array('path' => 'path/to/logo.png',
˓→'width' => 100, 'height' => 100, 'ratio' => false));
$templateProcessor->setImageValue('FeatureImage', function () {
// Closure will only be executed if the replacement tag is found in the template
7.4 cloneBlock
${block_name}
Customer: ${customer_name}
Address: ${customer_address}
${/block_name}
The following will duplicate everything between ${block_name} and ${/block_name} 3 times.
The last parameter will rename any macro defined inside the block and add #1, #2, #3 . . . to the macro name. The
result will be
Customer: ${customer_name#1}
Address: ${customer_address#1}
Customer: ${customer_name#3}
Address: ${customer_address#3}
It is also possible to pass an array with the values to replace the marcros with. If an array with replacements is passed,
the count argument is ignored, it is the size of the array that counts.
$replacements = array(
array('customer_name' => 'Batman', 'customer_address' => 'Gotham City'),
array('customer_name' => 'Superman', 'customer_address' => 'Metropolis'),
);
$templateProcessor->cloneBlock('block_name', 0, true, false, $replacements);
Customer: Batman
Address: Gotham City
Customer: Superman
Address: Metropolis
7.5 replaceBlock
${block_name}
This block content will be replaced
${/block_name}
The following will replace everything between ${block_name} and ${/block_name} with the value passed.
7.6 deleteBlock
$templateProcessor->deleteBlock('block_name');
7.7 cloneRow
+-----------+----------------+
| ${userId} | ${userName} |
| |----------------+
(continues on next page)
7.5. replaceBlock 37
PHPWord Documentation, Release 0.18.2
$templateProcessor->cloneRow('userId', 2);
Will result in
+-------------+------------------+
| ${userId#1} | ${userName#1} |
| |------------------+
| | ${userAddress#1} |
+-------------+------------------+
| ${userId#2} | ${userName#2} |
| |------------------+
| | ${userAddress#2} |
+-------------+------------------+
7.8 cloneRowAndSetValues
Finds a row in a table row identified by $search param and clones it as many times as there are entries in $values.
+-----------+----------------+
| ${userId} | ${userName} |
| |----------------+
| | ${userAddress} |
+-----------+----------------+
$values = [
['userId' => 1, 'userName' => 'Batman', 'userAddress' => 'Gotham City'],
['userId' => 2, 'userName' => 'Superman', 'userAddress' => 'Metropolis'],
];
$templateProcessor->cloneRowAndSetValues('userId', $values);
Will result in
+---+-------------+
| 1 | Batman |
| |-------------+
| | Gotham City |
+---+-------------+
| 2 | Superman |
| |-------------+
| | Metropolis |
+---+-------------+
7.9 applyXslStyleSheet
Applies the XSL stylesheet passed to header part, footer part and main part
7.10 setComplexValue
7.11 setComplexBlock
$table = new Table(array('borderSize' => 12, 'borderColor' => 'green', 'width' =>
˓→6000, 'unit' => TblWidth::TWIP));
$table->addRow();
$table->addCell(150)->addText('Cell A1');
$table->addCell(150)->addText('Cell A2');
$table->addCell(150)->addText('Cell A3');
$table->addRow();
$table->addCell(150)->addText('Cell B1');
$table->addCell(150)->addText('Cell B2');
$table->addCell(150)->addText('Cell B3');
$templateProcessor->setComplexBlock('table', $table);
7.12 setChartValue
7.13 save
Saves the loaded template within the current directory. Returns the file path.
$filepath = $templateProcessor->save();
7.10. setComplexValue 39
PHPWord Documentation, Release 0.18.2
7.14 saveAs
$pathToSave = 'path/to/save/file.ext';
$templateProcessor->saveAs($pathToSave);
8.1 OOXML
* document.rels.xml
– media/
– theme/
* theme1.xml
– document.xml
– fontTable.xml
– numbering.xml
– settings.xml
– styles.xml
– webSettings.xml
• [Content_Types].xml
41
PHPWord Documentation, Release 0.18.2
8.2 OpenDocument
8.2.1 Package
8.2.2 content.xml
* office:text
· draw:*
· office:forms
· table:table
· text:list
· text:numbered-paragraph
· text:p
· text:table-of-contents
· text:section
* office:chart
* office:image
* office:drawing
8.2.3 styles.xml
– office:master-styles
* office:master-page
8.3 RTF
To be completed.
8.4 HTML
To be completed.
8.5 PDF
To be completed.
8.3. RTF 43
PHPWord Documentation, Release 0.18.2
Recipes
$imageStyle = array(
'width' => 40,
'height' => 40,
'wrappingStyle' => 'square',
'positioning' => 'absolute',
'posHorizontalRel' => 'margin',
'posVerticalRel' => 'line',
);
$textrun->addImage('resources/_earth.jpg', $imageStyle);
$textrun->addText($lipsumText);
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
(continues on next page)
45
PHPWord Documentation, Release 0.18.2
Define a numbering style and title styles, and match the two styles (with pStyle and numStyle) like below.
$phpWord->addNumberingStyle(
'hNum',
array('type' => 'multilevel', 'levels' => array(
array('pStyle' => 'Heading1', 'format' => 'decimal', 'text' => '%1'),
array('pStyle' => 'Heading2', 'format' => 'decimal', 'text' => '%1.%2'),
array('pStyle' => 'Heading3', 'format' => 'decimal', 'text' => '%1.%2.%3'),
)
)
);
$phpWord->addTitleStyle(1, array('size' => 16), array('numStyle' => 'hNum', 'numLevel
˓→' => 0));
$section = $phpWord->addSection();
// Textrun
$textrun = $section->addTextRun('Heading1');
$textrun->addText('The ');
$textrun->addLink('https://github.com/PHPOffice/PHPWord', 'PHPWord', 'Link');
// Link
$section->addLink('https://github.com/', 'GitHub', 'Link', 'Heading2');
46 Chapter 9. Recipes
PHPWord Documentation, Release 0.18.2
$phpWord->getCompatibility()->setOoxmlVersion(15);
48 Chapter 9. Recipes
CHAPTER 10
No. This one is much better with tons of new features that you can’t find in PHPWord 0.6.3. The development in
CodePlex is halted and switched to GitHub to allow more participation from the crowd. The more the merrier, right?
10.3 I’ve been running PHPWord from CodePlex flawlessly, but I can’t
use the latest PHPWord from GitHub. Why?
PHPWord requires PHP 5.3+ since 0.8, while PHPWord 0.6.3 from CodePlex can run with PHP 5.2. There’s a lot of
new features that we can get from PHP 5.3 and it’s been around since 2009! You should upgrade your PHP version to
use PHPWord 0.8+.
49
PHPWord Documentation, Release 0.18.2
Credits
51
PHPWord Documentation, Release 0.18.2
References
53
PHPWord Documentation, Release 0.18.2
• genindex
• modindex
• search
55