Диаграммы PhpSpreadsheet не сохраняют и / или не повреждают файл - PullRequest
1 голос
/ 31 января 2020

Итак, я работаю над приложением для создания отчетов, которое требует создания Xls-файлов с диаграммами. Графики не работают, хотя. Я попытался просто заменить приведенный ниже код примером в github PhpSpreadsheet, но это также не работает.

У меня есть следующее для вставки данных (и диаграммы) в лист:

$this->spreadsheet->createSheet();

$worksheet = $this->spreadsheet->getActiveSheet();
$worksheet->setTitle($title);
$periodStartArray = array(array('', $periodStartDate, $periodEndDate));

while (!empty($stack)) {
    $node = array_pop($stack);
    if ($node->getData()['portfolioData'][0] != null) {
        if ($node->getData()['portfolioData'][0]->getIncludeInStatusSide()) {
            $startValue = (float)$this->getDataPoint($node, 'general', $this->periodStart, 'value');
            $startValuePercent = number_format(($startValue / $this->startingTotalValues) * 100, $this->percentDecimals, $decimalPoints, $separators);

            $endValue = (float)$this->getDataPoint($node, 'general', $this->periodEnd, 'value');
            $endValuePercent = number_format(($endValue / $this->endingTotalValues) * 100, $this->percentDecimals, $decimalPoints, $separators);

            $startArray = array($node->getData()['portfolioData'][0]->getNavn(), $startValuePercent, $endValuePercent);

            $periodStartArray[] = $startArray;
        }
    }
}

$maxSize = count($periodStartArray);
$worksheet->fromArray($periodStartArray);
//$title . '!$B$1'

$dataSeriesLabels1 = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, $title . '!$B$1', null, 1),
];

// $maxSize - 1 should give the actual number of data points (since the first entry in the array is the 
// date row

$dataString = "'" . $title . "'" . '!$A$2:$A$' . $maxSize;
$xAxisTickValues1 = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, $dataString, null, $maxSize - 1)
];

$dataString = "'" . $title . "'" . '!$B$2:$B$' . $maxSize;
$dataSeriesValues1 = [
    new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, $dataString, null, $maxSize - 1)
];

$series = new DataSeries(
    DataSeries::TYPE_PIECHART,
    null,
    range(0, count($dataSeriesValues1) - 1),
    $dataSeriesLabels1,
    $xAxisTickValues1,
    $dataSeriesValues1
);

$layout = new Layout();
$layout->setShowVal(true);
$layout->setShowPercent(false);

$plotArea = new PlotArea($layout, array($series));
$legend = new Legend(Legend::POSITION_RIGHT, null, false);

$title = new Title($title);

$chart1 = new Chart(
    'chart1',
    $title,
    $legend,
    $plotArea,
    true, 
    0, 
    null, 
    null
);

$chart1->setTopLeftPosition('A10');
$chart1->setBottomRightPosition('P25');
$worksheet->addChart($chart1);

Он успешно вставляет данные в электронную таблицу, но не печатает никаких диаграмм. Вот где я сохраняю электронную таблицу:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($this->spreadsheet);
$writer->setIncludeCharts(true);
$writer->save($this->outputFile); 

Итак, я включаю диаграммы, но диаграммы не отображаются. Когда я изменяю формат на Xlsx, кажется, что он пытается вставить диаграммы, но они повреждены, а Excel удаляет их. Это просто простые данные. Буквально одна строка названия компании в столбце A и две даты значений в столбцах B и C. Когда я вручную вставляю диаграммы после того, как генерируется файл Excel, это работает без проблем.

1 Ответ

0 голосов
/ 31 марта 2020

Измените 0 на «разрыв» при создании диаграммы.

$chart1 = new Chart(
'chart1',
$title,
$legend,
$plotArea,
true, 
'gap', // use 'gap' instead of 0, 
null, 
null

);

Ниже приведена проблема для PhPSpreadsheet

Файл, содержащий График не может быть открыт в Excel 2003/2013/2019

...