Графический дизайн 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); 

есть ли способ сделать это, чтобы настроить графики?

Как заявил Ржанге, 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 и позволит вам отображать линейные диаграммы

В моем случае я хотел изменить исходные цвета круговой диаграммы, я смог это сделать, отредактировав класс PHPExcel_Writer_Excel2007_Theme без редактирования его оригинального сценария Excel2007 следующим образом:

  • скопируйте папку Excel2007 и Excel2007 мимо нее в той же папке с другим именем, например «Excel2007Custom»
  • открыть все классы в папке Excel2007Custom и переименовать классы, например

    PHPExcel_Writer_Excel2007_Chart станет PHPExcel_Writer_Excel2007Custom_Chart

    PHPExcel_Writer_Excel2007_Comments станет PHPExcel_Writer_Excel2007Custom_Comments

и так далее.

  • скопируйте файл Excel2007.php и 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 класса PHPExcel_Writer_Excel2007Custom_Theme класса $_colourScheme
  • В конце концов я назвал классного писателя так:

 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007Custom'); 

Просто потребовалось несколько часов, чтобы посмотреть на это -> изменить цвет графиков.

Откройте файлы 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 1.7.9 не позволяет делать что угодно.

В piechart я обнаружил, что PHPExcel записывает только 1 datapoint из серии, номер 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]);