add column widths and merged cell functionality to spout

This commit is contained in:
willkensonh 2018-10-11 12:21:51 +11:00
parent 738ea30f35
commit a6a8b9e80f
2 changed files with 129 additions and 0 deletions

View File

@ -2,6 +2,8 @@
namespace Box\Spout\Writer\Common\Entity;
use Box\Spout\Common\Exception\IOException;
/**
* Class Worksheet
* Entity describing a Worksheet
@ -23,6 +25,14 @@ class Worksheet
/** @var int Index of the last written row */
private $lastWrittenRowIndex;
private $colWidths;
private $defaultColWidth;
private $defaultRowHeight;
private $merges;
/**
* Worksheet constructor.
*
@ -110,4 +120,120 @@ class Worksheet
// sheet index is zero-based, while ID is 1-based
return $this->externalSheet->getIndex() + 1;
}
/**
* sets default column width --- Must be set before WorksheetManager->startSheet() is called on this sheet
* @param string $col in letter format eg A or AC
* @param float $width
* @throws IOException
*/
public function setColWidth(string $col, float $width)
{
$this->throwIfSheetFilePointerIsAlreadyCreated();
$this->colWidths[$col] = $width;
}
/**
* sets default column width --- Must be set before WorksheetManager->startSheet() is called on this sheet
* @param float $width
* @throws IOException
*/
public function setDefaultColWidth(float $width)
{
$this->throwIfSheetFilePointerIsAlreadyCreated();
$this->defaultColWidth = $width;
}
/**
* sets default row height --- Must be set before WorksheetManager->startSheet() is called on this sheet
* @param float $height
* @throws IOException
*/
public function setDefaultRowHeight(float $height)
{
$this->throwIfSheetFilePointerIsAlreadyCreated();
$this->defaultRowHeight = $height;
}
/**
* merge cells params should be letter and number cell reference eg A3, A5
* @param string $leftCell
* @param string $rightCell
*/
public function mergeCells(string $leftCell, string $rightCell)
{
$this->merges[] = $leftCell . ':' . $rightCell;
}
/**
* remove merged cell reference.
* @param string $leftCell
* @param string $rightCell
*/
public function unMergeCells(string $leftCell, string $rightCell)
{
$this->merges = array_diff($this->merges,[$leftCell . ':' . $rightCell]);
}
/**
* used by WorksheetManager to get default row height and width xml to inject into worksheet xml file
* @return string
*/
public function getDefaultXML() : string
{
if (empty($this->defaultColWidth) && empty($this->defaultRowHeight)) {
return '';
}
return '<sheetFormatPr' .
(empty($this->defaultColWidth) ? '' : ' defaultColWidth="'.$this->defaultColWidth.'"') .
(empty($this->defaultRowHeight) ? '' : ' defaultRowHeight="'.$this->defaultRowHeight.'"') .
'/>';
}
/**
* used by WorksheetManager to get column width references xml to inject into worksheet xml file
* @return string
*/
public function getColWidthXML()
{
if (empty($colWidths)) {
return '';
}
$xml = '<cols>';
foreach ($this->colWidths as $col => $width) {
$xml .= '<col min="'.$col.'" max="'.$col.'" width="'.$width.'" style="1" customWidth="1"/>'; //style and customWidth may be unnecessary ??
}
$xml .= '</cols>';
return $xml;
}
/**
* used by WorksheetManager to get merged cell references xml to inject into worksheet xml file
* @return string
*/
public function getMergeXML() : string
{
if (empty($this->merges)) {
return '';
}
$xml = '<mergeCells count="'.count($this->merges).'">';
foreach ($this->merges as $merge) {
$xml .= '<mergeCell ref="'.$merge.'"/>';
}
$xml .= '</mergeCells>';
return $xml;
}
/**
* Checks if the sheet has already been started - throws exception
*
* @throws IOException If the sheet data file is already opened
* @return void
*/
private function throwIfSheetFilePointerIsAlreadyCreated()
{
if (!empty($this->filePointer)) {
throw new IOException('Trying to add default or column width settings after sheet is created');
}
}
}

View File

@ -113,6 +113,8 @@ EOD;
$worksheet->setFilePointer($sheetFilePointer);
fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER);
fwrite($sheetFilePointer, $worksheet->getDefaultXML());
fwrite($sheetFilePointer, $worksheet->getColWidthXML());
fwrite($sheetFilePointer, '<sheetData>');
}
@ -268,6 +270,7 @@ EOD;
}
fwrite($worksheetFilePointer, '</sheetData>');
fwrite($worksheetFilePointer, $worksheet->getMergeXML());
fwrite($worksheetFilePointer, '</worksheet>');
fclose($worksheetFilePointer);
}