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

Другие вопросы по тегам