Сохраняйте диаграммы с помощью PHP Spreadsheet 1.2.1 - PullRequest
0 голосов
/ 07 июня 2018

Я читаю файл XLSX в качестве шаблона и заполняю пару существующих рабочих листов.Некоторые другие листы в файле, к которым я не прикасаюсь, содержат ссылки на обновленные листы, а также диаграммы на основе этих связанных ячеек.

Когда я сохраняю шаблон в виде нового файла XLSX после заполнения данных диаграммамиушли с другого листа, который я даже не трогал.

Я добавил оператор "includeCharts" для писателя, но это не помогло либо

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->setIncludeCharts(true);
$writer->save($systemPath);

Любое представление о том, что янужно сделать, чтобы не потерять графики?

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Обходной путь заключается в том, чтобы фактически динамически создавать статические диапазоны программно.Другого пути, к сожалению, нет.В моем случае мои графики полностью динамические, то есть длина базовой таблицы тоже динамическая.Я попытался решить эту проблему с помощью PHP Spreadsheet, динамически манипулируя диаграммой следующим образом.В основном это сработало, но часть моих изменений впоследствии была перезаписана, поэтому она не была действительно успешной. Теперь я решил сдаться: сейчас я создам все свои диаграммы программно, потому что изменение диаграммы из шаблона имеет слишком много ограничений, если вы используетединамические графики.

foreach ($worksheet->getChartCollection() as $chart) {
if ($chart instanceof Chart) {
    $plotArea = $chart->getPlotArea(); //get the plot area of the chart (one thing)
    $dataSeries = $plotArea->getPlotGroup(); //array of all the data series
    $dataManipulated = false;
    foreach ($dataSeries as &$dataSer) { //by reference to change the values deep down!!
        $val = $dataSer->getPlotValues();
        foreach ( $val as &$dataSeriesValues) {
            $dataSource = $dataSeriesValues->getDataSource();
            $dataValues = $dataSeriesValues->getDataValues();
            $dataValuesLength = count($dataValues);
            for ($y=$pointCount; $y < $dataValuesLength; $y++) {
                unset($dataValues[$y]);
            }                        
            if ( strpos($dataSource, 'DRange_Dates_' . $tf ) !== false ) {
                $dataSeriesValues->setDataSource( $sheetName . '!D2:' . $xC . '2' );                            
            } elseif ( strpos($dataSource, 'DRange_AvgVarInt_modified_' . $tf ) !== false ) {
                $dataSeriesValues->setDataSource( 'midlayer!B10:' . $xCML . '10' ); 
            } elseif ( strpos($dataSource, 'DRange_AvgVarRate_' . $tf ) !== false ) {
                $dataSeriesValues->setDataSource( 'midlayer!B7:' . $xCML . '7' ); 
            }
            $dataSeriesValues->setDataValues( $dataValues );
        }
        $cat = $dataSer->getPlotCategories();
        foreach ( $cat as &$categoryValues) {
            $dataSource = $categoryValues->getDataSource();
            $dataValues = $categoryValues->getDataValues();
            $dataValuesLength = count($dataValues);
            for ($y=$pointCount; $y < $dataValuesLength; $y++) {
                unset($dataValues[$y]);
            }                        
            if ( strpos($dataSource, 'DRange_Dates_' . $tf ) !== false ) {
                $categoryValues->setDataSource( $sheetName . '!D2:' . $xC . '2' );                            
            } elseif ( strpos($dataSource, 'DRange_AvgVarInt_modified_' . $tf ) !== false ) {
                $categoryValues->setDataSource( 'midlayer!B10:' . $xCML . '10' ); 
            } elseif ( strpos($dataSource, 'DRange_AvgVarRate_' . $tf ) !== false ) {
                $categoryValues->setDataSource( 'midlayer!B7:' . $xCML . '7' ); 
            }
            $categoryValues->setDataValues( $dataValues );
        }
    }
    $plotArea->setPlotSeries($dataSeries); 
    unset($dataSeriesValues); // break the reference with the last element
    unset($categoryValues); // break the reference with the last element
    unset($dataSer); // break the reference with the last element               
}

}

Если вы хотите, чтобы ваши диаграммы выглядели немного лучше, вы сталкиваетесь со следующим препятствием.Вы не можете сами установить цветовую схему диаграмм.

class Theme extends WriterPart

содержит это

private static $colourScheme = [
    'dk2' => '1F497D',
    'lt2' => 'EEECE1',
    'accent1' => '4F81BD',
    'accent2' => 'C0504D',
    'accent3' => '9BBB59',
    'accent4' => '8064A2',
    'accent5' => '4BACC6',
    'accent6' => 'F79646',
    'hlink' => '0000FF',
    'folHlink' => '800080',
];

Это стандартная цветовая схема Office в шестнадцатеричном формате.Используя это, ваши графики будут выглядеть как чьи-либо другие.Если вы не хотите, чтобы вы могли изменить это, за исключением жестко закодированного изменения, которое, конечно, не лучший выбор.Но я не нашел другого пути.Если у кого есть лучший способ, пожалуйста, скажите мне.Благодарю.Также было бы здорово использовать несколько цветовых схем вместо одной.К сожалению, не нашел способа сделать это.

0 голосов
/ 09 июня 2018

Нашел ответ здесь.Последний комментарий от nic86 (4 дня назад) сделал свое дело.Но он работает только для xlsx, что достаточно для меня.

Excel из шаблона не копировал диаграммы.# 382

Впоследствии я застрял с другой проблемой: если вы хотите иметь диаграммы, основанные на динамических именованных диапазонах: неудача.Существует ошибка, которая была замечена некоторое время назад, но, похоже, ничего не происходит.Также здесь: Нет ответа на мой вопрос ... Это описание ошибки: Определенный диапазон имен из файла шаблона, не копируемого в файл # 462

Точнее, это работает (статичнодиапазон)

 $spreadsheet->addNamedRange( new NamedRange('DRange_AvgVarInt_modified', $worksheet, 'A1', true) );

Это не работает (динамический диапазон)

$spreadsheet->addNamedRange( new NamedRange('DRange_AvgVarRate', $worksheet, '=OFFSET(midlayer!$B$7,0,0,1,MIN(BaseData!$C$2,36))', true) );

Сообщение об ошибке:

Exception: Invalid cell coordinate 36))

Видимо, PHPSpreadsheet пытается разрешить выражениевместо того, чтобы просто копировать это.Есть идеи по поводу работы?Или кто-нибудь может предоставить исправление ошибки.Я не достаточно хороший кодер, чтобы сделать это, к сожалению, сам.Но мне бы очень не хотелось возвращаться к статическим диапазонам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...