- Use constants instead of hardcoded name and size for font (Arial, 20)
- Section: Multicolumn
- Section: Different section break
- Paragraph: Hanging paragraph
- Font: Superscript and subscript
- Table: Table width in percentage
- Table: Repeat as header row
- Table: Allow row to break across pages
This commit is contained in:
Ivan Lanin 2014-03-06 20:57:00 +07:00
parent d3f62567e9
commit 7533d30125
7 changed files with 144 additions and 51 deletions

View File

@ -39,8 +39,8 @@ if (!defined('PHPWORD_BASE_PATH')) {
class PHPWord class PHPWord
{ {
const DEFAULT_FONT_NAME = 'Times New Roman'; const DEFAULT_FONT_NAME = 'Arial';
const DEFAULT_FONT_SIZE = 24; const DEFAULT_FONT_SIZE = 20;
/** /**
* Document properties * Document properties

View File

@ -168,6 +168,34 @@ class PHPWord_Section_Settings
*/ */
private $footerHeight; private $footerHeight;
/**
* Section columns count
*
* @var int
*/
private $_colsNum;
/**
* Section spacing between columns
*
* @var int
*/
private $_colsSpace;
/**
* Section break type
*
* Options:
* - nextPage: Next page section break
* - nextColumn: Column section break
* - continuous: Continuous section break
* - evenPage: Even page section break
* - oddPage: Odd page section break
*
* @var string
*/
private $_breakType;
/** /**
* Create new Section Settings * Create new Section Settings
*/ */
@ -190,6 +218,9 @@ class PHPWord_Section_Settings
$this->_borderBottomColor = null; $this->_borderBottomColor = null;
$this->headerHeight = 720; // set default header and footer to 720 twips (.5 inches) $this->headerHeight = 720; // set default header and footer to 720 twips (.5 inches)
$this->footerHeight = 720; $this->footerHeight = 720;
$this->_colsNum = 1;
$this->_colsSpace = 720;
$this->_breakType = null;
} }
/** /**
@ -618,4 +649,62 @@ class PHPWord_Section_Settings
$this->footerHeight = $pValue; $this->footerHeight = $pValue;
return $this; return $this;
} }
/**
* Set Section Columns Count
*
* @param in $pValue
*/
public function setColsNum($pValue = '') {
$this->_colsNum = $pValue;
return $this;
}
/**
* Get Section Columns Count
*
* @return int
*/
public function getColsNum() {
return $this->_colsNum;
}
/**
* Set Section Space Between Columns
*
* @param int $pValue
*/
public function setColsSpace($pValue = '') {
$this->_colsSpace = $pValue;
return $this;
}
/**
* Get Section Space Between Columns
*
* @return int
*/
public function getColsSpace() {
return $this->_colsSpace;
}
/**
* Set Break Type
*
* @param string $pValue
*/
public function setBreakType($pValue = null) {
$this->_breakType = $pValue;
return $this;
}
/**
* Get Break Type
*
* @return string
*/
public function getBreakType() {
return $this->_breakType;
}
} }

View File

@ -30,10 +30,6 @@
*/ */
class PHPWord_Style_Table class PHPWord_Style_Table
{ {
const WIDTH_TYPE_NIL = 'nil'; // No Width
const WIDTH_TYPE_PERCENT = 'pct'; // Width in Fiftieths of a Percent
const WIDTH_TYPE_POINT = 'dxa'; // Width in Twentieths of a Point
const WIDTH_TYPE_AUTO = 'auto'; // Automatically Determined Width
private $_cellMarginTop; private $_cellMarginTop;
private $_cellMarginLeft; private $_cellMarginLeft;

View File

@ -122,6 +122,7 @@ class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
$spaceAfter = $style->getSpaceAfter(); $spaceAfter = $style->getSpaceAfter();
$spacing = $style->getSpacing(); $spacing = $style->getSpacing();
$indent = $style->getIndent(); $indent = $style->getIndent();
$hanging = $style->getHanging();
$tabs = $style->getTabs(); $tabs = $style->getTabs();
if (!is_null($align) || !is_null($spacing) || !is_null($spaceBefore) || !is_null($spaceAfter) || !is_null($indent) || !is_null($tabs)) { if (!is_null($align) || !is_null($spacing) || !is_null($spaceBefore) || !is_null($spaceAfter) || !is_null($indent) || !is_null($tabs)) {
@ -135,10 +136,15 @@ class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
$objWriter->endElement(); $objWriter->endElement();
} }
if (!is_null($indent)) { if (!is_null($indent) || !is_null($hanging)) {
$objWriter->startElement('w:ind'); $objWriter->startElement('w:ind');
$objWriter->writeAttribute('w:firstLine', 0); $objWriter->writeAttribute('w:firstLine', 0);
$objWriter->writeAttribute('w:left', $indent); if (!is_null($indent)) {
$objWriter->writeAttribute('w:left', $indent);
}
if (!is_null($hanging)) {
$objWriter->writeAttribute('w:hanging', $hanging);
}
$objWriter->endElement(); $objWriter->endElement();
} }
@ -322,11 +328,13 @@ class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
$fgColor = $style->getFgColor(); $fgColor = $style->getFgColor();
$striketrough = $style->getStrikethrough(); $striketrough = $style->getStrikethrough();
$underline = $style->getUnderline(); $underline = $style->getUnderline();
$superscript = $style->getSuperScript();
$subscript = $style->getSubScript();
$objWriter->startElement('w:rPr'); $objWriter->startElement('w:rPr');
// Font // Font
if ($font != 'Arial') { if ($font != PHPWord::DEFAULT_FONT_NAME) {
$objWriter->startElement('w:rFonts'); $objWriter->startElement('w:rFonts');
$objWriter->writeAttribute('w:ascii', $font); $objWriter->writeAttribute('w:ascii', $font);
$objWriter->writeAttribute('w:hAnsi', $font); $objWriter->writeAttribute('w:hAnsi', $font);
@ -342,7 +350,7 @@ class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
} }
// Size // Size
if ($size != 20) { if ($size != PHPWord::DEFAULT_FONT_SIZE) {
$objWriter->startElement('w:sz'); $objWriter->startElement('w:sz');
$objWriter->writeAttribute('w:val', $size); $objWriter->writeAttribute('w:val', $size);
$objWriter->endElement(); $objWriter->endElement();
@ -381,6 +389,13 @@ class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
$objWriter->endElement(); $objWriter->endElement();
} }
// Superscript/subscript
if ($superscript || $subscript) {
$objWriter->startElement('w:vertAlign');
$objWriter->writeAttribute('w:val', $superscript ? 'superscript' : 'subscript');
$objWriter->endElement();
}
$objWriter->endElement(); $objWriter->endElement();
} }
@ -397,6 +412,7 @@ class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
if ($_cRows > 0) { if ($_cRows > 0) {
$objWriter->startElement('w:tbl'); $objWriter->startElement('w:tbl');
$tblStyle = $table->getStyle(); $tblStyle = $table->getStyle();
$tblWidth = $table->getWidth();
if ($tblStyle instanceof PHPWord_Style_Table) { if ($tblStyle instanceof PHPWord_Style_Table) {
$this->_writeTableStyle($objWriter, $tblStyle); $this->_writeTableStyle($objWriter, $tblStyle);
} else { } else {
@ -405,26 +421,46 @@ class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
$objWriter->startElement('w:tblStyle'); $objWriter->startElement('w:tblStyle');
$objWriter->writeAttribute('w:val', $tblStyle); $objWriter->writeAttribute('w:val', $tblStyle);
$objWriter->endElement(); $objWriter->endElement();
if (!is_null($tblWidth)) {
$objWriter->startElement('w:tblW');
$objWriter->writeAttribute('w:w', $tblWidth);
$objWriter->writeAttribute('w:type', 'pct');
$objWriter->endElement();
}
$objWriter->endElement(); $objWriter->endElement();
} }
} }
$_heights = $table->getRowHeights();
for ($i = 0; $i < $_cRows; $i++) { for ($i = 0; $i < $_cRows; $i++) {
$row = $_rows[$i]; $row = $_rows[$i];
$height = $_heights[$i]; $height = $row->getHeight();
$rowStyle = $row->getStyle();
$tblHeader = $rowStyle->getTblHeader();
$cantSplit = $rowStyle->getCantSplit();
$objWriter->startElement('w:tr'); $objWriter->startElement('w:tr');
if (!is_null($height)) { if (!is_null($height) || !is_null($tblHeader) || !is_null($cantSplit)) {
$objWriter->startElement('w:trPr'); $objWriter->startElement('w:trPr');
$objWriter->startElement('w:trHeight'); if (!is_null($height)) {
$objWriter->writeAttribute('w:val', $height); $objWriter->startElement('w:trHeight');
$objWriter->endElement(); $objWriter->writeAttribute('w:val', $height);
$objWriter->endElement();
}
if (!is_null($tblHeader)) {
$objWriter->startElement('w:tblHeader');
$objWriter->writeAttribute('w:val', $tblHeader);
$objWriter->endElement();
}
if (!is_null($cantSplit)) {
$objWriter->startElement('w:cantSplit');
$objWriter->writeAttribute('w:val', $cantSplit);
$objWriter->endElement();
}
$objWriter->endElement(); $objWriter->endElement();
} }
foreach ($row as $cell) { foreach ($row->getCells() as $cell) {
$objWriter->startElement('w:tc'); $objWriter->startElement('w:tc');
$cellStyle = $cell->getStyle(); $cellStyle = $cell->getStyle();

View File

@ -140,9 +140,9 @@ class PHPWord_Writer_Word2007_Document extends PHPWord_Writer_Word2007_Base
$borders = $settings->getBorderSize(); $borders = $settings->getBorderSize();
$colsNum = $_settings->getColsNum(); $colsNum = $settings->getColsNum();
$colsSpace = $_settings->getColsSpace(); $colsSpace = $settings->getColsSpace();
$breakType = $_settings->getBreakType(); $breakType = $settings->getBreakType();
$objWriter->startElement('w:sectPr'); $objWriter->startElement('w:sectPr');
@ -159,7 +159,6 @@ class PHPWord_Writer_Word2007_Document extends PHPWord_Writer_Word2007_Base
$objWriter->endElement(); $objWriter->endElement();
} }
// http://www.schemacentral.com/sc/ooxml/a-w_val-43.html
if (!is_null($breakType)) { if (!is_null($breakType)) {
$objWriter->startElement('w:type'); $objWriter->startElement('w:type');
$objWriter->writeAttribute('w:val', $breakType); $objWriter->writeAttribute('w:val', $breakType);
@ -247,12 +246,8 @@ class PHPWord_Writer_Word2007_Document extends PHPWord_Writer_Word2007_Base
} }
$objWriter->startElement('w:cols'); $objWriter->startElement('w:cols');
if($colsNum > 1){ $objWriter->writeAttribute('w:num', $colsNum);
$objWriter->writeAttribute('w:num', $colsNum); $objWriter->writeAttribute('w:space', $colsSpace);
$objWriter->writeAttribute('w:space', $colsSpace);
} else {
$objWriter->writeAttribute('w:space', '720');
}
$objWriter->endElement(); $objWriter->endElement();

View File

@ -56,22 +56,6 @@ class PHPWord_Writer_Word2007_Styles extends PHPWord_Writer_Word2007_Base
// Write DocDefaults // Write DocDefaults
$this->_writeDocDefaults($objWriter); $this->_writeDocDefaults($objWriter);
// Reset Normal Paragraph Style
$objWriter->startElement('w:style');
$objWriter->writeAttribute('w:type', 'paragraph');
$objWriter->writeAttribute('w:default', '1');
$objWriter->writeAttribute('w:styleId', 'Normal');
$objWriter->startElement('w:name');
$objWriter->writeAttribute('w:val', 'Normal');
$objWriter->endElement(); // w:name
$objWriter->startElement('w:pPr');
$objWriter->startElement('w:spacing');
$objWriter->writeAttribute('w:before', 0);
$objWriter->writeAttribute('w:after', 0);
$objWriter->writeAttribute('w:line', 240);
$objWriter->endElement(); // w:spacing
$objWriter->endElement(); // w:pPr
$objWriter->endElement(); // w:style
// Write Style Definitions // Write Style Definitions
$styles = PHPWord_Style::getStyles(); $styles = PHPWord_Style::getStyles();
@ -108,9 +92,6 @@ class PHPWord_Writer_Word2007_Styles extends PHPWord_Writer_Word2007_Base
$objWriter->endElement(); $objWriter->endElement();
if (!is_null($paragraphStyle)) { if (!is_null($paragraphStyle)) {
$objWriter->startElement('w:basedOn');
$objWriter->writeAttribute('w:val', 'Normal');
$objWriter->endElement();
$this->_writeParagraphStyle($objWriter, $paragraphStyle); $this->_writeParagraphStyle($objWriter, $paragraphStyle);
} }
@ -128,10 +109,6 @@ class PHPWord_Writer_Word2007_Styles extends PHPWord_Writer_Word2007_Base
$objWriter->writeAttribute('w:val', $styleName); $objWriter->writeAttribute('w:val', $styleName);
$objWriter->endElement(); $objWriter->endElement();
$objWriter->startElement('w:basedOn');
$objWriter->writeAttribute('w:val', 'Normal');
$objWriter->endElement();
$this->_writeParagraphStyle($objWriter, $style); $this->_writeParagraphStyle($objWriter, $style);
$objWriter->endElement(); $objWriter->endElement();

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<w:settings xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main"> <w:settings xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main">
<w:zoom w:percent="100" /> <w:zoom w:percent="100" />
<w:embedSystemFonts /> <w:embedSystemFonts />