Added support for mergeCells, cell height, shrink to fit

Added support for
    mergeCells:
        // mergeCells (B2:G2), you may use CellHelper::getColumnLettersFromColumnIndex() to convert from "B2" to "[1,2]"
	    $writer->mergeCells([1,2], [6, 2]);

    cell height:
        $row->setHeight(30);

    shouldShrinkToFit:
        $style->setShouldShrinkToFit();

These changes are implemented for XLSX as that's what I need and test spout on.
This commit is contained in:
Lucian Sirbu committed 2020-05-04 16:48:18 +03:00
1 parent ab973cab34
commit 488bc371a5
10 files changed
+174 -2

No files matched your search

@@ -183,6 +183,17 @@ class StyleBuilder
return $this;
}
/**
* Set should shrink to fit
* @param boolean $shrinkToFit
* @return void
*/
public function setShouldShrinkToFit($shrinkToFit = true)
{
$this->style->setShouldShrinkToFit($shrinkToFit);
return $this;
}
/**
* Returns the configured style. The style is cached and can be reused.
*
@@ -20,4 +20,10 @@ abstract class Options
// XLSX specific options
const SHOULD_USE_INLINE_STRINGS = 'shouldUseInlineStrings';
// XLSX column widths
const COLUMN_WIDTHS = 'columnWidths';
// XLSX merge cells
const MERGE_CELLS = 'mergeCells';
}
+22
View File
@@ -27,6 +27,9 @@ class Sheet
/** @var SheetManager Sheet manager */
private $sheetManager;
/** @var bool Sheet is started */
private $isSheetStarted = false;
/**
* @param int $sheetIndex Index of the sheet, based on order in the workbook (zero-based)
* @param string $associatedWorkbookId ID of the sheet's associated workbook
@@ -108,4 +111,23 @@ class Sheet
return $this;
}
/**
* @return bool isSheetStarted Sheet was started
*/
public function isSheetStarted()
{
return $this->isSheetStarted;
}
/**
* @param bool $isSheetStarted Set if sheet was started
* @return Sheet
*/
public function setIsSheetStarted($isSheetStarted)
{
$this->isSheetStarted = $isSheetStarted;
return $this;
}
}
@@ -61,6 +61,29 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
return $this;
}
/**
* Set columns widths as list. If value is null will set column with default width (8.43)
* @param array $columnWidths
* @return WriterMultiSheetsAbstract
*/
public function setColumnWidths(array $columnWidths)
{
$this->optionsManager->setOption(Options::COLUMN_WIDTHS, $columnWidths);
return $this;
}
/**
* Undocumented function
*
* @param array $range
* @return void
*/
public function mergeCells(array $range1, array $range2)
{
$this->optionsManager->addOption(Options::MERGE_CELLS, [$range1, $range2]);
return $this;
}
/**
* {@inheritdoc}
*/
@@ -39,6 +39,8 @@ class OptionsManager extends OptionsManagerAbstract
Options::DEFAULT_ROW_STYLE,
Options::SHOULD_CREATE_NEW_SHEETS_AUTOMATICALLY,
Options::SHOULD_USE_INLINE_STRINGS,
Options::COLUMN_WIDTHS,
Options::MERGE_CELLS,
];
}
@@ -56,5 +58,7 @@ class OptionsManager extends OptionsManagerAbstract
$this->setOption(Options::DEFAULT_ROW_STYLE, $defaultRowStyle);
$this->setOption(Options::SHOULD_CREATE_NEW_SHEETS_AUTOMATICALLY, true);
$this->setOption(Options::SHOULD_USE_INLINE_STRINGS, true);
$this->setOption(Options::COLUMN_WIDTHS, []);
$this->setOption(Options::MERGE_CELLS, []);
}
}
@@ -258,6 +258,10 @@ EOD;
if ($style->shouldWrapText()) {
$content .= ' wrapText="1"';
}
if ($style->shouldShrinkToFit()) {
$content .= ' shrinkToFit="true"';
}
$content .= '/>';
$content .= '</xf>';
} else {
@@ -37,6 +37,8 @@ class WorksheetManager implements WorksheetManagerInterface
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
EOD;
/** @var OptionsManagerInterface */
private $optionsManager;
/** @var bool Whether inline or shared strings should be used */
protected $shouldUseInlineStrings;
@@ -84,6 +86,7 @@ EOD;
StringHelper $stringHelper,
InternalEntityFactory $entityFactory
) {
$this->optionsManager = $optionsManager;
$this->shouldUseInlineStrings = $optionsManager->getOption(Options::SHOULD_USE_INLINE_STRINGS);
$this->rowManager = $rowManager;
$this->styleManager = $styleManager;
@@ -113,7 +116,6 @@ EOD;
$worksheet->setFilePointer($sheetFilePointer);
\fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER);
\fwrite($sheetFilePointer, '<sheetData>');
}
/**
@@ -153,11 +155,28 @@ EOD;
*/
private function addNonEmptyRow(Worksheet $worksheet, Row $row)
{
if (!$worksheet->getExternalSheet()->isSheetStarted()) {
// create nodes for columns widths
if ($this->optionsManager->getOption(Options::COLUMN_WIDTHS)) {
$colsString = '<cols>';
foreach ($this->optionsManager->getOption(Options::COLUMN_WIDTHS) as $index => $width) {
$index++;
$colsString.= '<col collapsed="false" customWidth="true" hidden="false" outlineLevel="0" style="0" max="'.$index.'" min="'.$index.'" width="'.$width.'"/>';
}
$colsString.="</cols>";
\fwrite($worksheet->getFilePointer(), $colsString);
}
\fwrite($worksheet->getFilePointer(), '<sheetData>');
$worksheet->getExternalSheet()->setIsSheetStarted(true);
}
$rowStyle = $row->getStyle();
$rowIndexOneBased = $worksheet->getLastWrittenRowIndex() + 1;
$numCells = $row->getNumCells();
$rowHeight = $row->getHeight();
$rowXML = '<row r="' . $rowIndexOneBased . '" spans="1:' . $numCells . '">';
$rowXML = '<row r="' . $rowIndexOneBased . '" spans="1:' . $numCells . '" customHeight="true"' . ' ht="'. $rowHeight . '">';
foreach ($row->getCells() as $columnIndexZeroBased => $cell) {
$rowXML .= $this->applyStyleAndGetCellXML($cell, $rowStyle, $rowIndexOneBased, $columnIndexZeroBased);
@@ -270,7 +289,26 @@ EOD;
return;
}
if (!$worksheet->getExternalSheet()->isSheetStarted()) {
\fwrite($worksheetFilePointer, '<sheetData>');
$worksheet->getExternalSheet()->setIsSheetStarted(true);
}
\fwrite($worksheetFilePointer, '</sheetData>');
// create nodes for merge cells
if ($this->optionsManager->getOption(Options::MERGE_CELLS)) {
$mergeCellString = '<mergeCells count="'.count($this->optionsManager->getOption(Options::MERGE_CELLS)).'">';
foreach ($this->optionsManager->getOption(Options::MERGE_CELLS) as $values) {
$output = array_map(function($value){
return CellHelper::getColumnLettersFromColumnIndex($value[0]) . $value[1];
}, $values);
$mergeCellString.= '<mergeCell ref="'.implode(':', $output).'"/>';
}
$mergeCellString.= '</mergeCells>';
\fwrite($worksheet->getFilePointer(), $mergeCellString);
}
\fwrite($worksheetFilePointer, '</worksheet>');
\fclose($worksheetFilePointer);
}