mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-22 16:19:19 +00:00
Merge branch 'master' into sorttoarray
This commit is contained in:
@@ -335,7 +335,7 @@ $helper->renderChart($chart, __FILE__);
|
|||||||
$spreadsheet->setActiveSheetIndex(1);
|
$spreadsheet->setActiveSheetIndex(1);
|
||||||
|
|
||||||
// Save Excel 2007 file
|
// Save Excel 2007 file
|
||||||
$helper->write($spreadsheet, __FILE__, ['Xlsx'], true);
|
$helper->write($spreadsheet, __FILE__, ['Xlsx'], true, resetActiveSheet: false);
|
||||||
$spreadsheet->disconnectWorksheets();
|
$spreadsheet->disconnectWorksheets();
|
||||||
|
|
||||||
function dateRange(int $nrows, Spreadsheet $wrkbk): array
|
function dateRange(int $nrows, Spreadsheet $wrkbk): array
|
||||||
|
|||||||
@@ -270,4 +270,4 @@ $helper->renderChart($chart, __FILE__);
|
|||||||
$spreadsheet->setActiveSheetIndex(1);
|
$spreadsheet->setActiveSheetIndex(1);
|
||||||
|
|
||||||
// Save Excel 2007 file
|
// Save Excel 2007 file
|
||||||
$helper->write($spreadsheet, __FILE__, ['Xlsx'], true);
|
$helper->write($spreadsheet, __FILE__, ['Xlsx'], true, resetActiveSheet: false);
|
||||||
|
|||||||
@@ -131,4 +131,4 @@ $helper->renderChart($chart, __FILE__);
|
|||||||
$spreadsheet->setActiveSheetIndex(1);
|
$spreadsheet->setActiveSheetIndex(1);
|
||||||
|
|
||||||
// Save Excel 2007 file
|
// Save Excel 2007 file
|
||||||
$helper->write($spreadsheet, __FILE__, ['Xlsx'], true);
|
$helper->write($spreadsheet, __FILE__, ['Xlsx'], true, resetActiveSheet: false);
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ class Axis extends Properties
|
|||||||
|
|
||||||
private ?AxisText $axisText = null;
|
private ?AxisText $axisText = null;
|
||||||
|
|
||||||
|
private ?Title $dispUnitsTitle = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Axis Options.
|
* Axis Options.
|
||||||
*
|
*
|
||||||
@@ -70,6 +72,28 @@ class Axis extends Properties
|
|||||||
'majorTimeUnit' => self::TIME_UNIT_YEARS,
|
'majorTimeUnit' => self::TIME_UNIT_YEARS,
|
||||||
'minorTimeUnit' => self::TIME_UNIT_MONTHS,
|
'minorTimeUnit' => self::TIME_UNIT_MONTHS,
|
||||||
'baseTimeUnit' => self::TIME_UNIT_DAYS,
|
'baseTimeUnit' => self::TIME_UNIT_DAYS,
|
||||||
|
'logBase' => null,
|
||||||
|
'dispUnitsBuiltIn' => null,
|
||||||
|
];
|
||||||
|
public const DISP_UNITS_HUNDREDS = 'hundreds';
|
||||||
|
public const DISP_UNITS_THOUSANDS = 'thousands';
|
||||||
|
public const DISP_UNITS_TEN_THOUSANDS = 'tenThousands';
|
||||||
|
public const DISP_UNITS_HUNDRED_THOUSANDS = 'hundredThousands';
|
||||||
|
public const DISP_UNITS_MILLIONS = 'millions';
|
||||||
|
public const DISP_UNITS_TEN_MILLIONS = 'tenMillions';
|
||||||
|
public const DISP_UNITS_HUNDRED_MILLIONS = 'hundredMillions';
|
||||||
|
public const DISP_UNITS_BILLIONS = 'billions';
|
||||||
|
public const DISP_UNITS_TRILLIONS = 'trillions';
|
||||||
|
public const DISP_UNITS_BUILTIN_INT = [
|
||||||
|
100 => self::DISP_UNITS_HUNDREDS,
|
||||||
|
1000 => self::DISP_UNITS_THOUSANDS,
|
||||||
|
10000 => self::DISP_UNITS_TEN_THOUSANDS,
|
||||||
|
100000 => self::DISP_UNITS_HUNDRED_THOUSANDS,
|
||||||
|
1000000 => self::DISP_UNITS_MILLIONS,
|
||||||
|
10000000 => self::DISP_UNITS_TEN_MILLIONS,
|
||||||
|
100000000 => self::DISP_UNITS_HUNDRED_MILLIONS,
|
||||||
|
1000000000 => self::DISP_UNITS_BILLIONS,
|
||||||
|
1000000000000 => self::DISP_UNITS_TRILLIONS,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -149,7 +173,9 @@ class Axis extends Properties
|
|||||||
?string $hidden = null,
|
?string $hidden = null,
|
||||||
?string $baseTimeUnit = null,
|
?string $baseTimeUnit = null,
|
||||||
?string $majorTimeUnit = null,
|
?string $majorTimeUnit = null,
|
||||||
?string $minorTimeUnit = null
|
?string $minorTimeUnit = null,
|
||||||
|
null|float|int|string $logBase = null,
|
||||||
|
?string $dispUnitsBuiltIn = null
|
||||||
): void {
|
): void {
|
||||||
$this->axisOptions['axis_labels'] = $axisLabels;
|
$this->axisOptions['axis_labels'] = $axisLabels;
|
||||||
$this->setAxisOption('horizontal_crosses_value', $horizontalCrossesValue);
|
$this->setAxisOption('horizontal_crosses_value', $horizontalCrossesValue);
|
||||||
@@ -166,6 +192,8 @@ class Axis extends Properties
|
|||||||
$this->setAxisOption('baseTimeUnit', $baseTimeUnit);
|
$this->setAxisOption('baseTimeUnit', $baseTimeUnit);
|
||||||
$this->setAxisOption('majorTimeUnit', $majorTimeUnit);
|
$this->setAxisOption('majorTimeUnit', $majorTimeUnit);
|
||||||
$this->setAxisOption('minorTimeUnit', $minorTimeUnit);
|
$this->setAxisOption('minorTimeUnit', $minorTimeUnit);
|
||||||
|
$this->setAxisOption('logBase', $logBase);
|
||||||
|
$this->setAxisOption('dispUnitsBuiltIn', $dispUnitsBuiltIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -317,6 +345,18 @@ class Axis extends Properties
|
|||||||
return $this->noFill;
|
return $this->noFill;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setDispUnitsTitle(?Title $dispUnitsTitle): self
|
||||||
|
{
|
||||||
|
$this->dispUnitsTitle = $dispUnitsTitle;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDispUnitsTitle(): ?Title
|
||||||
|
{
|
||||||
|
return $this->dispUnitsTitle;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
||||||
*/
|
*/
|
||||||
@@ -326,6 +366,7 @@ class Axis extends Properties
|
|||||||
$this->majorGridlines = ($this->majorGridlines === null) ? null : clone $this->majorGridlines;
|
$this->majorGridlines = ($this->majorGridlines === null) ? null : clone $this->majorGridlines;
|
||||||
$this->majorGridlines = ($this->minorGridlines === null) ? null : clone $this->minorGridlines;
|
$this->majorGridlines = ($this->minorGridlines === null) ? null : clone $this->minorGridlines;
|
||||||
$this->axisText = ($this->axisText === null) ? null : clone $this->axisText;
|
$this->axisText = ($this->axisText === null) ? null : clone $this->axisText;
|
||||||
|
$this->dispUnitsTitle = ($this->dispUnitsTitle === null) ? null : clone $this->dispUnitsTitle;
|
||||||
$this->fillColor = clone $this->fillColor;
|
$this->fillColor = clone $this->fillColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class Title
|
|||||||
/**
|
/**
|
||||||
* Title Caption.
|
* Title Caption.
|
||||||
*
|
*
|
||||||
* @var array|RichText|string
|
* @var null|array|RichText|string may be null
|
||||||
*/
|
*/
|
||||||
private $caption = '';
|
private $caption = '';
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ class Title
|
|||||||
/**
|
/**
|
||||||
* Create a new Title.
|
* Create a new Title.
|
||||||
*
|
*
|
||||||
* @param array|RichText|string $caption
|
* @param null|array|RichText|string $caption may be null
|
||||||
* @param bool $overlay
|
* @param bool $overlay
|
||||||
*/
|
*/
|
||||||
public function __construct($caption = '', ?Layout $layout = null, $overlay = false)
|
public function __construct($caption = '', ?Layout $layout = null, $overlay = false)
|
||||||
@@ -52,7 +52,7 @@ class Title
|
|||||||
/**
|
/**
|
||||||
* Get caption.
|
* Get caption.
|
||||||
*
|
*
|
||||||
* @return array|RichText|string
|
* @return null|array|RichText|string may be null
|
||||||
*/
|
*/
|
||||||
public function getCaption()
|
public function getCaption()
|
||||||
{
|
{
|
||||||
@@ -68,6 +68,9 @@ class Title
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$caption = $this->caption;
|
$caption = $this->caption;
|
||||||
|
if ($caption === null) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
if (is_string($caption)) {
|
if (is_string($caption)) {
|
||||||
return $caption;
|
return $caption;
|
||||||
}
|
}
|
||||||
@@ -91,7 +94,7 @@ class Title
|
|||||||
/**
|
/**
|
||||||
* Set caption.
|
* Set caption.
|
||||||
*
|
*
|
||||||
* @param array|RichText|string $caption
|
* @param null|array|RichText|string $caption may be null
|
||||||
*
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -111,13 +111,14 @@ class Sample
|
|||||||
/**
|
/**
|
||||||
* Write documents.
|
* Write documents.
|
||||||
*
|
*
|
||||||
* @param string $filename
|
|
||||||
* @param string[] $writers
|
* @param string[] $writers
|
||||||
*/
|
*/
|
||||||
public function write(Spreadsheet $spreadsheet, $filename, array $writers = ['Xlsx', 'Xls'], bool $withCharts = false, ?callable $writerCallback = null): void
|
public function write(Spreadsheet $spreadsheet, string $filename, array $writers = ['Xlsx', 'Xls'], bool $withCharts = false, ?callable $writerCallback = null, bool $resetActiveSheet = true): void
|
||||||
{
|
{
|
||||||
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
|
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
|
||||||
$spreadsheet->setActiveSheetIndex(0);
|
if ($resetActiveSheet) {
|
||||||
|
$spreadsheet->setActiveSheetIndex(0);
|
||||||
|
}
|
||||||
|
|
||||||
// Write documents
|
// Write documents
|
||||||
foreach ($writers as $writerType) {
|
foreach ($writers as $writerType) {
|
||||||
|
|||||||
@@ -494,7 +494,7 @@ class Chart
|
|||||||
|
|
||||||
private function chartTitle(SimpleXMLElement $titleDetails): Title
|
private function chartTitle(SimpleXMLElement $titleDetails): Title
|
||||||
{
|
{
|
||||||
$caption = [];
|
$caption = null;
|
||||||
$titleLayout = null;
|
$titleLayout = null;
|
||||||
$titleOverlay = false;
|
$titleOverlay = false;
|
||||||
$titleFormula = null;
|
$titleFormula = null;
|
||||||
@@ -503,6 +503,7 @@ class Chart
|
|||||||
$chartDetail = Xlsx::testSimpleXml($chartDetail);
|
$chartDetail = Xlsx::testSimpleXml($chartDetail);
|
||||||
switch ($titleDetailKey) {
|
switch ($titleDetailKey) {
|
||||||
case 'tx':
|
case 'tx':
|
||||||
|
$caption = [];
|
||||||
if (isset($chartDetail->rich)) {
|
if (isset($chartDetail->rich)) {
|
||||||
$titleDetails = $chartDetail->rich->children($this->aNamespace);
|
$titleDetails = $chartDetail->rich->children($this->aNamespace);
|
||||||
foreach ($titleDetails as $titleKey => $titleDetail) {
|
foreach ($titleDetails as $titleKey => $titleDetail) {
|
||||||
@@ -1518,6 +1519,13 @@ class Chart
|
|||||||
if (isset($chartDetail->crossBetween)) {
|
if (isset($chartDetail->crossBetween)) {
|
||||||
$whichAxis->setCrossBetween((string) self::getAttributeString($chartDetail->crossBetween, 'val'));
|
$whichAxis->setCrossBetween((string) self::getAttributeString($chartDetail->crossBetween, 'val'));
|
||||||
}
|
}
|
||||||
|
if (isset($chartDetail->dispUnits, $chartDetail->dispUnits->builtInUnit)) {
|
||||||
|
$whichAxis->setAxisOption('dispUnitsBuiltIn', (string) self::getAttributeString($chartDetail->dispUnits->builtInUnit, 'val'));
|
||||||
|
if (isset($chartDetail->dispUnits->dispUnitsLbl)) {
|
||||||
|
$whichAxis->setDispUnitsTitle(new Title());
|
||||||
|
// TODO parse title elements
|
||||||
|
}
|
||||||
|
}
|
||||||
if (isset($chartDetail->majorTickMark)) {
|
if (isset($chartDetail->majorTickMark)) {
|
||||||
$whichAxis->setAxisOption('major_tick_mark', (string) self::getAttributeString($chartDetail->majorTickMark, 'val'));
|
$whichAxis->setAxisOption('major_tick_mark', (string) self::getAttributeString($chartDetail->majorTickMark, 'val'));
|
||||||
}
|
}
|
||||||
@@ -1533,6 +1541,9 @@ class Chart
|
|||||||
if (isset($chartDetail->crossesAt)) {
|
if (isset($chartDetail->crossesAt)) {
|
||||||
$whichAxis->setAxisOption('horizontal_crosses_value', (string) self::getAttributeString($chartDetail->crossesAt, 'val'));
|
$whichAxis->setAxisOption('horizontal_crosses_value', (string) self::getAttributeString($chartDetail->crossesAt, 'val'));
|
||||||
}
|
}
|
||||||
|
if (isset($chartDetail->scaling->logBase)) {
|
||||||
|
$whichAxis->setAxisOption('logBase', (string) self::getAttributeString($chartDetail->scaling->logBase, 'val'));
|
||||||
|
}
|
||||||
if (isset($chartDetail->scaling->orientation)) {
|
if (isset($chartDetail->scaling->orientation)) {
|
||||||
$whichAxis->setAxisOption('orientation', (string) self::getAttributeString($chartDetail->scaling->orientation, 'val'));
|
$whichAxis->setAxisOption('orientation', (string) self::getAttributeString($chartDetail->scaling->orientation, 'val'));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,38 +158,40 @@ class Chart extends WriterPart
|
|||||||
}
|
}
|
||||||
|
|
||||||
$objWriter->startElement('c:title');
|
$objWriter->startElement('c:title');
|
||||||
$objWriter->startElement('c:tx');
|
|
||||||
$objWriter->startElement('c:rich');
|
|
||||||
|
|
||||||
$objWriter->startElement('a:bodyPr');
|
|
||||||
$objWriter->endElement();
|
|
||||||
|
|
||||||
$objWriter->startElement('a:lstStyle');
|
|
||||||
$objWriter->endElement();
|
|
||||||
|
|
||||||
$objWriter->startElement('a:p');
|
|
||||||
$objWriter->startElement('a:pPr');
|
|
||||||
$objWriter->startElement('a:defRPr');
|
|
||||||
$objWriter->endElement();
|
|
||||||
$objWriter->endElement();
|
|
||||||
|
|
||||||
$caption = $title->getCaption();
|
$caption = $title->getCaption();
|
||||||
if (is_array($caption)) {
|
if ($caption !== null) {
|
||||||
$caption = $caption[0] ?? '';
|
$objWriter->startElement('c:tx');
|
||||||
}
|
$objWriter->startElement('c:rich');
|
||||||
$this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
|
|
||||||
|
|
||||||
$objWriter->endElement();
|
$objWriter->startElement('a:bodyPr');
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // a:bodyPr
|
||||||
$objWriter->endElement();
|
|
||||||
|
$objWriter->startElement('a:lstStyle');
|
||||||
|
$objWriter->endElement(); // a:lstStyle
|
||||||
|
|
||||||
|
$objWriter->startElement('a:p');
|
||||||
|
$objWriter->startElement('a:pPr');
|
||||||
|
$objWriter->startElement('a:defRPr');
|
||||||
|
$objWriter->endElement(); // a:defRPr
|
||||||
|
$objWriter->endElement(); // a:pPr
|
||||||
|
|
||||||
|
if (is_array($caption)) {
|
||||||
|
$caption = $caption[0] ?? '';
|
||||||
|
}
|
||||||
|
$this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
|
||||||
|
|
||||||
|
$objWriter->endElement(); // a:p
|
||||||
|
$objWriter->endElement(); // c:rich
|
||||||
|
$objWriter->endElement(); // c:tx
|
||||||
|
}
|
||||||
|
|
||||||
$this->writeLayout($objWriter, $title->getLayout());
|
$this->writeLayout($objWriter, $title->getLayout());
|
||||||
|
|
||||||
$objWriter->startElement('c:overlay');
|
$objWriter->startElement('c:overlay');
|
||||||
$objWriter->writeAttribute('val', ($title->getOverlay()) ? '1' : '0');
|
$objWriter->writeAttribute('val', ($title->getOverlay()) ? '1' : '0');
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // c:overlay
|
||||||
|
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // c:title
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -587,6 +589,14 @@ class Chart extends WriterPart
|
|||||||
}
|
}
|
||||||
|
|
||||||
$objWriter->startElement('c:scaling');
|
$objWriter->startElement('c:scaling');
|
||||||
|
if (is_numeric($yAxis->getAxisOptionsProperty('logBase'))) {
|
||||||
|
$logBase = $yAxis->getAxisOptionsProperty('logBase') + 0;
|
||||||
|
if ($logBase >= 2 && $logBase <= 1000) {
|
||||||
|
$objWriter->startElement('c:logBase');
|
||||||
|
$objWriter->writeAttribute('val', (string) $logBase);
|
||||||
|
$objWriter->endElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
if ($yAxis->getAxisOptionsProperty('maximum') !== null) {
|
if ($yAxis->getAxisOptionsProperty('maximum') !== null) {
|
||||||
$objWriter->startElement('c:max');
|
$objWriter->startElement('c:max');
|
||||||
$objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('maximum'));
|
$objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('maximum'));
|
||||||
@@ -632,35 +642,37 @@ class Chart extends WriterPart
|
|||||||
|
|
||||||
if ($xAxisLabel !== null) {
|
if ($xAxisLabel !== null) {
|
||||||
$objWriter->startElement('c:title');
|
$objWriter->startElement('c:title');
|
||||||
$objWriter->startElement('c:tx');
|
|
||||||
$objWriter->startElement('c:rich');
|
|
||||||
|
|
||||||
$objWriter->startElement('a:bodyPr');
|
|
||||||
$objWriter->endElement();
|
|
||||||
|
|
||||||
$objWriter->startElement('a:lstStyle');
|
|
||||||
$objWriter->endElement();
|
|
||||||
|
|
||||||
$objWriter->startElement('a:p');
|
|
||||||
|
|
||||||
$caption = $xAxisLabel->getCaption();
|
$caption = $xAxisLabel->getCaption();
|
||||||
if (is_array($caption)) {
|
if ($caption !== null) {
|
||||||
$caption = $caption[0];
|
$objWriter->startElement('c:tx');
|
||||||
}
|
$objWriter->startElement('c:rich');
|
||||||
$this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
|
|
||||||
|
|
||||||
$objWriter->endElement();
|
$objWriter->startElement('a:bodyPr');
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // a:bodyPr
|
||||||
$objWriter->endElement();
|
|
||||||
|
$objWriter->startElement('a:lstStyle');
|
||||||
|
$objWriter->endElement(); // a::lstStyle
|
||||||
|
|
||||||
|
$objWriter->startElement('a:p');
|
||||||
|
|
||||||
|
if (is_array($caption)) {
|
||||||
|
$caption = $caption[0];
|
||||||
|
}
|
||||||
|
$this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
|
||||||
|
|
||||||
|
$objWriter->endElement(); // a:p
|
||||||
|
$objWriter->endElement(); // c:rich
|
||||||
|
$objWriter->endElement(); // c:tx
|
||||||
|
}
|
||||||
|
|
||||||
$layout = $xAxisLabel->getLayout();
|
$layout = $xAxisLabel->getLayout();
|
||||||
$this->writeLayout($objWriter, $layout);
|
$this->writeLayout($objWriter, $layout);
|
||||||
|
|
||||||
$objWriter->startElement('c:overlay');
|
$objWriter->startElement('c:overlay');
|
||||||
$objWriter->writeAttribute('val', '0');
|
$objWriter->writeAttribute('val', '0');
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // c:overlay
|
||||||
|
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // c:title
|
||||||
}
|
}
|
||||||
|
|
||||||
$objWriter->startElement('c:numFmt');
|
$objWriter->startElement('c:numFmt');
|
||||||
@@ -796,6 +808,14 @@ class Chart extends WriterPart
|
|||||||
}
|
}
|
||||||
|
|
||||||
$objWriter->startElement('c:scaling');
|
$objWriter->startElement('c:scaling');
|
||||||
|
if (is_numeric($xAxis->getAxisOptionsProperty('logBase'))) {
|
||||||
|
$logBase = $xAxis->getAxisOptionsProperty('logBase') + 0;
|
||||||
|
if ($logBase >= 2 && $logBase <= 1000) {
|
||||||
|
$objWriter->startElement('c:logBase');
|
||||||
|
$objWriter->writeAttribute('val', (string) $logBase);
|
||||||
|
$objWriter->endElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($xAxis->getAxisOptionsProperty('maximum') !== null) {
|
if ($xAxis->getAxisOptionsProperty('maximum') !== null) {
|
||||||
$objWriter->startElement('c:max');
|
$objWriter->startElement('c:max');
|
||||||
@@ -845,26 +865,28 @@ class Chart extends WriterPart
|
|||||||
|
|
||||||
if ($yAxisLabel !== null) {
|
if ($yAxisLabel !== null) {
|
||||||
$objWriter->startElement('c:title');
|
$objWriter->startElement('c:title');
|
||||||
$objWriter->startElement('c:tx');
|
|
||||||
$objWriter->startElement('c:rich');
|
|
||||||
|
|
||||||
$objWriter->startElement('a:bodyPr');
|
|
||||||
$objWriter->endElement();
|
|
||||||
|
|
||||||
$objWriter->startElement('a:lstStyle');
|
|
||||||
$objWriter->endElement();
|
|
||||||
|
|
||||||
$objWriter->startElement('a:p');
|
|
||||||
|
|
||||||
$caption = $yAxisLabel->getCaption();
|
$caption = $yAxisLabel->getCaption();
|
||||||
if (is_array($caption)) {
|
if ($caption !== null) {
|
||||||
$caption = $caption[0];
|
$objWriter->startElement('c:tx');
|
||||||
}
|
$objWriter->startElement('c:rich');
|
||||||
$this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
|
|
||||||
|
|
||||||
$objWriter->endElement();
|
$objWriter->startElement('a:bodyPr');
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // a:bodyPr
|
||||||
$objWriter->endElement();
|
|
||||||
|
$objWriter->startElement('a:lstStyle');
|
||||||
|
$objWriter->endElement(); // a:lstStyle
|
||||||
|
|
||||||
|
$objWriter->startElement('a:p');
|
||||||
|
|
||||||
|
if (is_array($caption)) {
|
||||||
|
$caption = $caption[0];
|
||||||
|
}
|
||||||
|
$this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
|
||||||
|
|
||||||
|
$objWriter->endElement(); // a:p
|
||||||
|
$objWriter->endElement(); // c:rich
|
||||||
|
$objWriter->endElement(); // c:tx
|
||||||
|
}
|
||||||
|
|
||||||
if ($groupType !== DataSeries::TYPE_BUBBLECHART) {
|
if ($groupType !== DataSeries::TYPE_BUBBLECHART) {
|
||||||
$layout = $yAxisLabel->getLayout();
|
$layout = $yAxisLabel->getLayout();
|
||||||
@@ -873,9 +895,9 @@ class Chart extends WriterPart
|
|||||||
|
|
||||||
$objWriter->startElement('c:overlay');
|
$objWriter->startElement('c:overlay');
|
||||||
$objWriter->writeAttribute('val', '0');
|
$objWriter->writeAttribute('val', '0');
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // c:overlay
|
||||||
|
|
||||||
$objWriter->endElement();
|
$objWriter->endElement(); // c:title
|
||||||
}
|
}
|
||||||
|
|
||||||
$objWriter->startElement('c:numFmt');
|
$objWriter->startElement('c:numFmt');
|
||||||
@@ -950,6 +972,22 @@ class Chart extends WriterPart
|
|||||||
$objWriter->endElement();
|
$objWriter->endElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($xAxis->getAxisType() === Axis::AXIS_TYPE_VALUE) {
|
||||||
|
$dispUnits = $xAxis->getAxisOptionsProperty('dispUnitsBuiltIn');
|
||||||
|
$dispUnits = is_numeric($dispUnits) ? (Axis::DISP_UNITS_BUILTIN_INT[(int) $dispUnits] ?? '') : $dispUnits;
|
||||||
|
if (in_array($dispUnits, Axis::DISP_UNITS_BUILTIN_INT, true)) {
|
||||||
|
$objWriter->startElement('c:dispUnits');
|
||||||
|
$objWriter->startElement('c:builtInUnit');
|
||||||
|
$objWriter->writeAttribute('val', $dispUnits);
|
||||||
|
$objWriter->endElement(); // c:builtInUnit
|
||||||
|
if ($xAxis->getDispUnitsTitle() !== null) {
|
||||||
|
// TODO output title elements
|
||||||
|
$objWriter->writeElement('c:dispUnitsLbl');
|
||||||
|
}
|
||||||
|
$objWriter->endElement(); // c:dispUnits
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($xAxis->getAxisOptionsProperty('major_unit') !== null) {
|
if ($xAxis->getAxisOptionsProperty('major_unit') !== null) {
|
||||||
$objWriter->startElement('c:majorUnit');
|
$objWriter->startElement('c:majorUnit');
|
||||||
$objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit'));
|
$objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit'));
|
||||||
|
|||||||
@@ -0,0 +1,142 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace PhpOffice\PhpSpreadsheetTests\Chart;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
|
||||||
|
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||||
|
|
||||||
|
class Issue3833Test extends AbstractFunctional
|
||||||
|
{
|
||||||
|
// based on 33_Char_create_scatter2
|
||||||
|
public function readCharts(XlsxReader $reader): void
|
||||||
|
{
|
||||||
|
$reader->setIncludeCharts(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function writeCharts(XlsxWriter $writer): void
|
||||||
|
{
|
||||||
|
$writer->setIncludeCharts(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDisplayUnits1(): void
|
||||||
|
{
|
||||||
|
$reader = new XlsxReader();
|
||||||
|
$reader->setIncludeCharts(true);
|
||||||
|
$spreadsheet = $reader->load('tests/data/Reader/XLSX/issue.3833.units.xlsx');
|
||||||
|
|
||||||
|
/** @var callable */
|
||||||
|
$callableReader = [$this, 'readCharts'];
|
||||||
|
/** @var callable */
|
||||||
|
$callableWriter = [$this, 'writeCharts'];
|
||||||
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', $callableReader, $callableWriter);
|
||||||
|
$spreadsheet->disconnectWorksheets();
|
||||||
|
|
||||||
|
$sheet = $reloadedSpreadsheet->getSheetByNameOrThrow('charts');
|
||||||
|
$charts2 = $sheet->getChartCollection();
|
||||||
|
self::assertCount(1, $charts2);
|
||||||
|
$chart2 = $charts2[0];
|
||||||
|
self::assertNotNull($chart2);
|
||||||
|
$yAxis = $chart2->getChartAxisY();
|
||||||
|
$dispUnits = $yAxis->getAxisOptionsProperty('dispUnitsBuiltIn');
|
||||||
|
self::assertSame('tenThousands', $dispUnits);
|
||||||
|
$logBase = $yAxis->getAxisOptionsProperty('logBase');
|
||||||
|
self::assertNull($logBase);
|
||||||
|
|
||||||
|
$reloadedSpreadsheet->disconnectWorksheets();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDisplayUnits2(): void
|
||||||
|
{
|
||||||
|
$reader = new XlsxReader();
|
||||||
|
$reader->setIncludeCharts(true);
|
||||||
|
$spreadsheet = $reader->load('tests/data/Reader/XLSX/issue.3833.units.xlsx');
|
||||||
|
$sheet1 = $spreadsheet->getSheetByNameOrThrow('charts');
|
||||||
|
$charts1 = $sheet1->getChartCollection();
|
||||||
|
self::assertCount(1, $charts1);
|
||||||
|
$chart1 = $charts1[0];
|
||||||
|
self::assertNotNull($chart1);
|
||||||
|
$yAxis1 = $chart1->getChartAxisY();
|
||||||
|
$yAxis1->setAxisOption('dispUnitsBuiltIn', 1000);
|
||||||
|
|
||||||
|
/** @var callable */
|
||||||
|
$callableReader = [$this, 'readCharts'];
|
||||||
|
/** @var callable */
|
||||||
|
$callableWriter = [$this, 'writeCharts'];
|
||||||
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', $callableReader, $callableWriter);
|
||||||
|
$spreadsheet->disconnectWorksheets();
|
||||||
|
|
||||||
|
$sheet = $reloadedSpreadsheet->getSheetByNameOrThrow('charts');
|
||||||
|
$charts2 = $sheet->getChartCollection();
|
||||||
|
self::assertCount(1, $charts2);
|
||||||
|
$chart2 = $charts2[0];
|
||||||
|
self::assertNotNull($chart2);
|
||||||
|
$yAxis = $chart2->getChartAxisY();
|
||||||
|
$dispUnits = $yAxis->getAxisOptionsProperty('dispUnitsBuiltIn');
|
||||||
|
self::assertSame('thousands', $dispUnits);
|
||||||
|
$logBase = $yAxis->getAxisOptionsProperty('logBase');
|
||||||
|
self::assertNull($logBase);
|
||||||
|
|
||||||
|
$reloadedSpreadsheet->disconnectWorksheets();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDisplayUnits3(): void
|
||||||
|
{
|
||||||
|
$reader = new XlsxReader();
|
||||||
|
$reader->setIncludeCharts(true);
|
||||||
|
$spreadsheet = $reader->load('tests/data/Reader/XLSX/issue.3833.units.xlsx');
|
||||||
|
$sheet1 = $spreadsheet->getSheetByNameOrThrow('charts');
|
||||||
|
$charts1 = $sheet1->getChartCollection();
|
||||||
|
self::assertCount(1, $charts1);
|
||||||
|
$chart1 = $charts1[0];
|
||||||
|
self::assertNotNull($chart1);
|
||||||
|
$yAxis1 = $chart1->getChartAxisY();
|
||||||
|
$yAxis1->setDispUnitsTitle(null);
|
||||||
|
|
||||||
|
/** @var callable */
|
||||||
|
$callableReader = [$this, 'readCharts'];
|
||||||
|
/** @var callable */
|
||||||
|
$callableWriter = [$this, 'writeCharts'];
|
||||||
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', $callableReader, $callableWriter);
|
||||||
|
$spreadsheet->disconnectWorksheets();
|
||||||
|
|
||||||
|
$sheet = $reloadedSpreadsheet->getSheetByNameOrThrow('charts');
|
||||||
|
$charts2 = $sheet->getChartCollection();
|
||||||
|
self::assertCount(1, $charts2);
|
||||||
|
$chart2 = $charts2[0];
|
||||||
|
self::assertNotNull($chart2);
|
||||||
|
$yAxis = $chart2->getChartAxisY();
|
||||||
|
self::assertNull($yAxis->getDispUnitsTitle());
|
||||||
|
|
||||||
|
$reloadedSpreadsheet->disconnectWorksheets();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testLogBase(): void
|
||||||
|
{
|
||||||
|
$reader = new XlsxReader();
|
||||||
|
$reader->setIncludeCharts(true);
|
||||||
|
$spreadsheet = $reader->load('tests/data/Reader/XLSX/issue.3833.logarithm.xlsx');
|
||||||
|
|
||||||
|
/** @var callable */
|
||||||
|
$callableReader = [$this, 'readCharts'];
|
||||||
|
/** @var callable */
|
||||||
|
$callableWriter = [$this, 'writeCharts'];
|
||||||
|
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', $callableReader, $callableWriter);
|
||||||
|
$spreadsheet->disconnectWorksheets();
|
||||||
|
|
||||||
|
$sheet = $reloadedSpreadsheet->getSheetByNameOrThrow('charts');
|
||||||
|
$charts2 = $sheet->getChartCollection();
|
||||||
|
self::assertCount(1, $charts2);
|
||||||
|
$chart2 = $charts2[0];
|
||||||
|
self::assertNotNull($chart2);
|
||||||
|
$yAxis = $chart2->getChartAxisY();
|
||||||
|
$logBase = $yAxis->getAxisOptionsProperty('logBase');
|
||||||
|
self::assertSame('10', $logBase);
|
||||||
|
$dispUnits = $yAxis->getAxisOptionsProperty('dispUnitsBuiltIn');
|
||||||
|
self::assertNull($dispUnits);
|
||||||
|
|
||||||
|
$reloadedSpreadsheet->disconnectWorksheets();
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user