5

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

グラフをカスタマイズする方法はありますか?

4

6 に答える 6

7

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

これは、Chart.php ファイルの 106 行目あたりにあります。

明らかに、「000000」を、チャートの境界線の色にしたいWebの色に置き換えます。境界線の色を完全に削除するには、次を挿入します。

$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 を好みの Web カラーに変更します。

また、後:

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チャートの種類ごとに変更をより動的にするには、適切に配置されたいくつかのステートメントで十分です。

于 2013-10-16T06:17:22.800 に答える
1

私の場合、円グラフの元の色に変更したかったので、元のライターExcel2007を次のようPHPExcel_Writer_Excel2007_Themeに編集せずにクラスを編集することでこれを達成できました。

  • フォルダーをコピー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');
于 2016-09-08T13:51:18.150 に答える
1

それを見るのに数時間かかりました->グラフの色を変更します。

ファイル 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();
    }
}

これがうまくいくことを願っています:-)

于 2017-05-05T14:07:00.317 に答える
0

円グラフでは、PHPExcel が 3 番目のセリエから 1 つのデータポイントのみを書き込むことがわかりました (なぜ 5 か 1 か、わかりません =) )。したがって、パイの色をカスタマイズしたい場合は、ファイル Classes/ を編集する必要があります。関数 _writePlotGroup 内の PHPExcel/Writer/Excel2007/Charts.php

//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]);

于 2015-04-05T21:38:46.333 に答える
0

現在のリリース: PHPExcel 1.7.9 では、やりたいことは何もできません。

于 2013-09-06T12:38:18.083 に答える