PHPExcel-Diagrammdesign (Rahmen, Diagrammfarbe, innere Position des Diagramms)

Lesezeit: 8 Minuten

Ich verwende PHPExcel, um eine Excel-Tabelle mit mehreren Diagrammen zu erstellen, und versuche, sie anzupassen. Ich habe nur noch 3 Probleme, die ungelöst sind: 1. Ich möchte, dass der Graph keinen Rand hat. 2. Ich möchte die Farbe der Diagrammlinien ändern. 3. Ich möchte die Position des Diagramms innerhalb des Diagrammbereichs ändern. Im Moment ist dies die Art und Weise, wie ich Diagramme erstelle:

$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);   

Gibt es eine Möglichkeit, Diagramme anzupassen?

Benutzer-Avatar
IIIOXIII

Wie Rzangue sagte, bietet PHPExcel derzeit keine einfache Möglichkeit, dies zu tun. Wenn es Ihnen jedoch nichts ausmacht, die Änderungen für alle mit PHPExcel erstellten Diagramme fest zu codieren, können Sie die unten vorgeschlagenen Änderungen an Ihrem PHPExcel/Classes/Writer vornehmen /Excel2007/Chart.php-Datei.

Um die Rahmenfarbe und -stärke des Diagramms zu ändern, fügen Sie in der öffentlichen Funktion writeChart() Folgendes hinzu:

$cBorderColor = "000000";
$objWriter->startElement('c:spPr');
    $objWriter->startElement('a:ln');
    $objWriter->writeAttribute('w', '40000');//alters border thickness
       $objWriter->startElement('a:solidFill');
           $objWriter->startElement('a:srgbClr');
           $objWriter->writeAttribute('val',$cBorderColor);//changes the color
           $objWriter->endElement();
       $objWriter->endElement();
    $objWriter->endElement();
$objWriter->endElement();

nach:

    $objWriter->startElement('c:showDLblsOverMax');
        $objWriter->writeAttribute('val', 0);
    $objWriter->endElement();
            
$objWriter->endElement();

Aber vorher:

$this->_writePrintSettings($objWriter); 

das sollte ungefähr in Zeile 106 der Chart.php-Datei sein.

Ersetzen Sie offensichtlich “000000” durch die Webfarbe, die Sie als Diagrammrandfarbe wünschen. Um die Rahmenfarbe vollständig zu entfernen, fügen Sie Folgendes ein:

$objWriter->startElement('c:spPr');
    $objWriter->startElement('a:ln');
        $objWriter->startElement('a:noFill');
        $objWriter->endElement();
    $objWriter->endElement();
$objWriter->endElement();

stattdessen.

Um die Positionierung des Diagrammbereichs innerhalb des Diagramms zu ändern, scrollen Sie als Nächstes in der Datei Chart.php nach unten zur privaten Funktion _writeLayout().

Löschen Sie den gesamten Code innerhalb der Funktion außer den öffnenden/schließenden Klammern {}. Fügen Sie innerhalb der Funktion Folgendes hinzu:

$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();

Sie können dann den x/y-Offset und w/h nach Belieben anpassen.

So steuern/ändern Sie die Farben jeder Datenreihe innerhalb von:

private function _writePlotGroup()

Vor:

foreach($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {

hinzufügen:

$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";

und so weiter, stellen Sie sicher, dass Sie genügend Farbindizes für alle Datenreihen hinzufügen und natürlich 111111,222222,333333 in Webfarben Ihrer Wahl ändern.

Auch danach:

foreach($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {

Hinzufügen:

$ci++;

Und danach:

//  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();
}

Hinzufügen:

$objWriter->startElement('c:spPr');
    $objWriter->startElement('a:solidFill');
        $objWriter->startElement('a:srgbClr');
            $objWriter->writeAttribute('val',$colorNDX[$ci]);
        $objWriter->endElement();
    $objWriter->endElement();
$objWriter->endElement();

Lassen Sie mich wissen, ob das hilft. Auch diese Änderungen werden auf alle von PHPExcel generierten Diagramme angewendet, jedoch ein paar gut platziert if Anweisungen sollten mehr als ausreichen, um die Änderungen pro Diagrammtyp dynamischer zu gestalten.

  • Vielen Dank für den Abschnitt bezüglich der Linienfarben. Exzellent! Falls jemand die Linienstärke ändern möchte, geht das wie folgt: $objWriter->startElement(‘c:spPr’); $objWriter->startElement(‘a:ln’); $objWriter->writeAttribute(‘w’, ‘40000’); $objWriter->startElement(‘a:solidFill’); $objWriter->startElement(‘a:srgbClr’); $objWriter->writeAttribute(‘val’,$colorNDX[$ci]); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement();

    – Georg

    24. Oktober 2013 um 10:14 Uhr


Benutzer-Avatar
Kev

Das Hinzufügen des Codes von IIIOXIII, insbesondere des folgenden Blocks, bei der Verwendung von LineCharts führte bei mir zu einem Fehler in 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();

Fügen Sie zunächst die folgende Bedingungsanweisung um den obigen Block herum ein

if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART && $groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {
    // above code block
}

Dann nach dem Block etwa ein Dutzend Zeilen weiter unten der Code, der lautet

if ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {
  $objWriter->startElement('a:noFill');
  $objWriter->endElement();
}

folgendes hinzufügen

$objWriter->startElement('a:solidFill');
  $objWriter->startElement('a:srgbClr');
   $objWriter->writeAttribute('val',$colorNDX[$ci])
  $objWriter->endElement();
$objWriter->endElement();

Dadurch wird verhindert, dass Excel Fehler macht, und Sie können Liniendiagramme einfärben

Benutzer-Avatar
Waqleh

In meinem Fall wollte ich zu den Originalfarben des Kreisdiagramms wechseln, dies konnte ich durch Bearbeiten der erreichen PHPExcel_Writer_Excel2007_Theme Klasse, ohne den ursprünglichen Autor zu bearbeiten Excel2007 so:

  • Kopieren Excel2007 Ordner und fügen Sie ihn im selben Ordner mit einem anderen Namen ein, z. B. “Excel2007Custom”.
  • Öffnen Sie alle Klassen in der Excel2007Custom Ordner und benennen Sie die Klassen um, z

    PHPExcel_Writer_Excel2007_Chart wird werden PHPExcel_Writer_Excel2007Custom_Chart

    PHPExcel_Writer_Excel2007_Comments wird werden PHPExcel_Writer_Excel2007Custom_Comments

usw.

  • Kopieren Excel2007.php Datei und fügen Sie sie im selben Ordner mit einem anderen Namen ein, z. B. ‘Excel2007Custom.php’
  • Öffnen Sie die Klassendatei Excel2007Custom.phpund:
    • Benennen Sie die Klassen um von PHPExcel_Writer_Excel2007 wird werden PHPExcel_Writer_Excel2007Custom
    • das Array ändern $writerPartsArray Wert im Konstruktor.

aus:


    $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'
     );

zu:


    $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'
     );
  • Und dann bearbeiten PHPExcel_Writer_Excel2007Custom_Theme Klasse $_colourScheme Klasse Eigentum
  • Am Ende rief ich den Klassenschreiber so an:

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

Ich habe nur ein paar Stunden gebraucht, um mir das anzusehen -> ändern Sie die Farbe der Diagramme.

Öffnen Sie die Dateien Theme.php\PHPExcel\Classes\PHPExcel\Writer\Excel2007\Theme.php

Unten finden Sie:

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();
    }
}

Stattdessen müssen Sie Folgendes platzieren:

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();
    }
}

Hoffe das funktioniert für dich 🙂

Die aktuelle Version: PHPExcel 1.7.9 erlaubt nicht, alles zu tun, was Sie wollen.

In den Tortendiagrammen habe ich festgestellt, dass PHPExcel nur 1 Datenpunkt aus der Serie schreibt, Nummer 3 (warum nicht 5 oder 1, ich weiß es nicht =)), daher müssen Sie die Datei Classes/ bearbeiten, wenn Sie die Farben der Torten anpassen möchten. PHPExcel/Writer/Excel2007/Charts.php in der Funktion _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]);

1018430cookie-checkPHPExcel-Diagrammdesign (Rahmen, Diagrammfarbe, innere Position des Diagramms)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy