Обходной путь заключается в том, чтобы фактически динамически создавать статические диапазоны программно.Другого пути, к сожалению, нет.В моем случае мои графики полностью динамические, то есть длина базовой таблицы тоже динамическая.Я попытался решить эту проблему с помощью 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 в шестнадцатеричном формате.Используя это, ваши графики будут выглядеть как чьи-либо другие.Если вы не хотите, чтобы вы могли изменить это, за исключением жестко закодированного изменения, которое, конечно, не лучший выбор.Но я не нашел другого пути.Если у кого есть лучший способ, пожалуйста, скажите мне.Благодарю.Также было бы здорово использовать несколько цветовых схем вместо одной.К сожалению, не нашел способа сделать это.