Графический дизайн PHPExcel (граница, цвет графика, внутренняя позиция графика)
Я использую PHPExcel для создания листа Excel с несколькими графиками, и я пытаюсь настроить их. У меня осталось только 3 проблемы: 1. Я хочу, чтобы у графа не было границ. 2. Я хочу изменить цвет линий графиков. 3. Я хочу изменить положение графика внутри области графиков. на данный момент я так строю графики:
$xAxisTickValues = $TruexAxisTickValues;
$series = new PHPExcel_Chart_DataSeries(
PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType
PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping
range(0, 10), // plotOrder
null, // plotLabel
$xAxisTickValues, // plotCategory
$values // plotValues
);
$series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_COL);
$plotarea = new PHPExcel_Chart_PlotArea(null, array($series));
$chart = new PHPExcel_Chart(
'chart1', // name
null, // title
null, // legend
$plotarea, // plotArea
true, // plotVisibleOnly
0, // displayBlanksAs
null, // xAxisLabel
null // yAxisLabel
);
$chart->setTopLeftPosition('C5' );
$chart->setBottomRightPosition('J11' );
$sheet->addChart($chart);
Есть ли способ сделать это настроить графики?
6 ответов
Как сказал Rzangue, PHPExcel в настоящее время не обеспечивает простого способа сделать это, однако, если вы не возражаете жестко запрограммировать изменения для всех графиков, созданных с помощью PHPExcel, вы можете внести предлагаемые ниже изменения в ваш PHPExcel/Classes/Writer/Excel2007/Chart.php файл.
Чтобы изменить цвет границы диаграммы, в публичной функции writeChart() добавьте:
$cBorderColor = "000000";
$objWriter->startElement('c:spPr');
$objWriter->startElement('a:ln');
$objWriter->startElement('a:solidFill');
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val',$cBorderColor);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
после:
$objWriter->startElement('c:showDLblsOverMax');
$objWriter->writeAttribute('val', 0);
$objWriter->endElement();
$objWriter->endElement();
но прежде:
$this->_writePrintSettings($objWriter);
которая должна быть в строке 106 файла Chart.php.
Очевидно, заменив "000000" тем цветом, который вы хотите использовать в качестве цвета границы диаграммы. Чтобы полностью удалить цвет границы, вставьте:
$objWriter->startElement('c:spPr');
$objWriter->startElement('a:ln');
$objWriter->startElement('a:noFill');
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
вместо.
Затем, чтобы изменить расположение области графика на диаграмме, прокрутите вниз в файле Chart.php до закрытой функции _writeLayout().
Удалить весь код внутри функции, кроме открывающих / закрывающих скобок {}
, Внутри функции добавьте:
$layoutTarget = "inner";
$xMode = "edge";
$yMode = "edge";
$xOffset = 0.1; //The left margin in percentage of graph width.
$yOffset = 0.1; //The top margin in percentage of graph width.
$paWidth = 0.9; //The percentage width of the plot area relative to the graph width;
$paHeight = 0.9; //The percentage height of the plot area relative to the graph height;
$objWriter->startElement('c:layout');
$objWriter->startElement('c:manualLayout');
$objWriter->startElement('c:layoutTarget');
$objWriter->writeAttribute('val',$layoutTarget);
$objWriter->endElement();
$objWriter->startElement('c:xMode');
$objWriter->writeAttribute('val',$xMode);
$objWriter->endElement();
$objWriter->startElement('c:yMode');
$objWriter->writeAttribute('val',$yMode);
$objWriter->endElement();
$objWriter->startElement('c:x');
$objWriter->writeAttribute('val',$xOffset);
$objWriter->endElement();
$objWriter->startElement('c:y');
$objWriter->writeAttribute('val',$yOffset);
$objWriter->endElement();
$objWriter->startElement('c:w');
$objWriter->writeAttribute('val',$paWidth);
$objWriter->endElement();
$objWriter->startElement('c:h');
$objWriter->writeAttribute('val',$paHeight);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
Затем вы можете настроить смещение x/y и w/h по своему желанию.
Для контроля / изменения цветов каждого ряда данных, в пределах:
private function _writePlotGroup()
до:
foreach($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {
добавлять:
$ci=-1;
$colorNDX=array();
$colorNDX[0] = "111111";
$colorNDX[1] = "222222";
$colorNDX[2] = "333333";
$colorNDX[3] = "444444";
$colorNDX[4] = "555555";
$colorNDX[5] = "666666";
$colorNDX[6] = "777777";
и так далее, обязательно добавив достаточное количество цветовых индексов для всех рядов данных и, очевидно, заменив 111111,222222,333333 на веб-цвета по своему вкусу.
Также после:
foreach($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {
Добавлять:
$ci++;
И после:
// Labels
$plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef);
if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) {
$objWriter->startElement('c:tx');
$objWriter->startElement('c:strRef');
$this->_writePlotSeriesLabel($plotSeriesLabel, $objWriter);
$objWriter->endElement();
$objWriter->endElement();
}
Добавлять:
$objWriter->startElement('c:spPr');
$objWriter->startElement('a:solidFill');
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val',$colorNDX[$ci]);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
Позвольте мне знать, если это помогает. Опять же, эти изменения будут применены ко всем графикам, сгенерированным PHPExcel, однако, пара хорошо расположена if
утверждений должно быть более чем достаточно, чтобы сделать изменения более динамичными для каждого типа диаграммы.
Добавление кода IIIOXIII, а именно следующего блока, при использовании LineCharts вызвало ошибку Excel 2007 для меня
$objWriter->startElement('c:spPr');
$objWriter->startElement('a:solidFill');
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val',$colorNDX[$ci]);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
Сначала добавьте следующий оператор условия вокруг вышеуказанного блока
if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART && $groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {
// above code block
}
Затем после блока около дюжины строк вниз по коду, который читает
if ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {
$objWriter->startElement('a:noFill');
$objWriter->endElement();
}
добавить следующее
$objWriter->startElement('a:solidFill');
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val',$colorNDX[$ci])
$objWriter->endElement();
$objWriter->endElement();
Это тогда предотвратит ошибку Excel и позволит вам раскрасить диаграммы линий
Просто потребовалось несколько часов, чтобы взглянуть на это -> изменить цвет графиков.
Откройте файлы Theme.php \PHPExcel\Classes\PHPExcel\Writer\Excel2007\Theme.php
Внизу вы найдете:
private function writeColourScheme($objWriter)
{
foreach (self::$colourScheme as $colourName => $colourValue) {
$objWriter->startElement('a:'.$colourName);
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val', $colourValue);
$objWriter->endElement();
$objWriter->endElement();
}
}
Вместо этого Вам нужно будет разместить это:
private function writeColourScheme($objWriter)
{
$ci = 0;
$colorNDX=array();
$colorNDX[0] = "a09a9a";
$colorNDX[1] = "1b1b1b";
$colorNDX[2] = "350d0d";
$colorNDX[3] = "ff0000";
$colorNDX[4] = "b9a8a8";
$colorNDX[5] = "a09a9a";
$colorNDX[6] = "ff0000";
$colorNDX[7] = "a09a9a";
$colorNDX[8] = "1b1b1b";
$colorNDX[9] = "ff0000";
$colorNDX[10] = "1b1b1b";
foreach (self::$colourScheme as $colourName => $colourValue) {
$objWriter->startElement('a:'.$colourName);
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val', $colorNDX[$ci]);
$objWriter->endElement();
$ci++;
$objWriter->endElement();
}
}
Надеюсь, эта работа для вас:-)
В моем случае я хотел изменить исходные цвета круговой диаграммы, я смог сделать это, отредактировав PHPExcel_Writer_Excel2007_Theme
Класс без редактирования исходного писателя Excel2007 примерно так:
- копия
Excel2007
и вставьте его в ту же папку с другим именем, например, "Excel2007Custom" открыть все классы в
Excel2007Custom
папку и переименовать классы, напримерPHPExcel_Writer_Excel2007_Chart
станетPHPExcel_Writer_Excel2007Custom_Chart
PHPExcel_Writer_Excel2007_Comments
станетPHPExcel_Writer_Excel2007Custom_Comments
и так далее.
- копия
Excel2007.php
файл и вставьте его в ту же папку с другим именем, например, "Excel2007Custom.php" - откройте файл класса
Excel2007Custom.php
а также:- переименовать классы из
PHPExcel_Writer_Excel2007
станетPHPExcel_Writer_Excel2007Custom
- изменить массив
$writerPartsArray
значение в конструкторе.
- переименовать классы из
от:
$writerPartsArray = array(
'stringtable' => 'PHPExcel_Writer_Excel2007_StringTable',
'contenttypes' => 'PHPExcel_Writer_Excel2007_ContentTypes',
'docprops' => 'PHPExcel_Writer_Excel2007_DocProps',
'rels' => 'PHPExcel_Writer_Excel2007_Rels',
'theme' => 'PHPExcel_Writer_Excel2007_Theme',
'style' => 'PHPExcel_Writer_Excel2007_Style',
'workbook' => 'PHPExcel_Writer_Excel2007_Workbook',
'worksheet' => 'PHPExcel_Writer_Excel2007_Worksheet',
'drawing' => 'PHPExcel_Writer_Excel2007_Drawing',
'comments' => 'PHPExcel_Writer_Excel2007_Comments',
'chart' => 'PHPExcel_Writer_Excel2007_Chart',
'relsvba' => 'PHPExcel_Writer_Excel2007_RelsVBA',
'relsribbonobjects' => 'PHPExcel_Writer_Excel2007_RelsRibbon'
);
чтобы:
$writerPartsArray = array(
'stringtable' => 'PHPExcel_Writer_Excel2007Custom_StringTable',
'contenttypes' => 'PHPExcel_Writer_Excel2007Custom_ContentTypes',
'docprops' => 'PHPExcel_Writer_Excel2007Custom_DocProps',
'rels' => 'PHPExcel_Writer_Excel2007Custom_Rels',
'theme' => 'PHPExcel_Writer_Excel2007Custom_Theme',
'style' => 'PHPExcel_Writer_Excel2007Custom_Style',
'workbook' => 'PHPExcel_Writer_Excel2007Custom_Workbook',
'worksheet' => 'PHPExcel_Writer_Excel2007Custom_Worksheet',
'drawing' => 'PHPExcel_Writer_Excel2007Custom_Drawing',
'comments' => 'PHPExcel_Writer_Excel2007Custom_Comments',
'chart' => 'PHPExcel_Writer_Excel2007Custom_Chart',
'relsvba' => 'PHPExcel_Writer_Excel2007Custom_RelsVBA',
'relsribbonobjects' => 'PHPExcel_Writer_Excel2007Custom_RelsRibbon'
);
- А потом редактирование
PHPExcel_Writer_Excel2007Custom_Theme
учебный класс$_colourScheme
свойство класса - В конце я назвал писателя класса следующим образом:
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007Custom');
Текущая версия: PHPExcel 1.7.9 не позволяет делать все, что вы хотите.
В круговых диаграммах я обнаружил, что PHPExcel записывает только 1 точку данных из серии, номер 3 (почему не 5 или 1, я не знаю =)), поэтому, если вы хотите настроить цвета пирогов, вы должны отредактировать файл Classes/PHPExcel/Writer/Excel2007/Charts.php в функции _writePlotGroup
//Getting datapoints and loop around $objWrite->startElement(c:dPt)
$plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef);
if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) ||
($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) ||
($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
foreach($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
...
/*instead of $objWriter->writeAttribute('val', 3); put after
$objWriter->startElement('c:dPt');
$objWriter->startElement('c:idx');*/
$objWriter->writeAttribute('val', $plotSeriesKey);
//according to previous answer, find the color of pie by index of datapoint in colorNDX
$objWriter->writeAttribute('val',$colorNDX[$plotSeriesKey]);