LoginSignup
0
0

PhpSpreadsheetをカスタマイズして、グラフマーカーの色を指定できるようにする

Posted at

PhpSpreadsheetでグラフを描画する際に、マーカーを指定する

    $arrDataSeriesValues = array(
        new DataSeriesValues(
            DataSeriesValues::DATASERIES_TYPE_NUMBER,
            '\'データシート\'!$A$1:$O$1',
            NULL,
            2 ,
            [] ,
            "diamond" , //←マーカー指定
            "3333ff" , //←グラフの色
            7 //←マーカーサイズ
        ),
    );

これだと、こんな感じになる。
スクリーンショット 2024-04-30 115737.png

DataSeriesValues.phpだとどうなっているのか?

コンストラクタで

    parent::__construct();
    $this->markerFillColor = new ChartColor(); //←マーカー本体の色
    $this->markerBorderColor = new ChartColor(); //←マーカーの枠の色

としている。
つまり、初期化してるけど色を指定していない。
実際にエクセルを開くと、「自動」が色指定されている。

グラフ本体とマーカーの色を合わせるには

DataSeriesValues.phpのカスタマイズが必要。
単純に合わせるだけなら

    parent::__construct();
    $this->markerFillColor = new ChartColor();
    $this->markerBorderColor = new ChartColor();

    parent::__construct();
    $this->markerFillColor = new ChartColor();
    if ($fillColor !== null) {
        $this->setMarkerFillColor($fillColor);
    }
    $this->markerBorderColor = new ChartColor();
    if ($fillColor !== null) {
        $this->setMarkerBorderColor($fillColor);
    }

中略

public function setMarkerBorderColor($color): static
{
    if (is_array($color)) {
        $this->markerBorderColor = [];
        foreach ($color as $fillString) {
            if ($fillString instanceof ChartColor) {
                $this->markerBorderColor[] = $fillString;
            } else {
                $this->markerBorderColor[] = $this->stringToChartColor($fillString);
            }
        }
    } elseif ($color instanceof ChartColor) {
        $this->markerBorderColor = $color;
    } else {
        $this->markerBorderColor = $this->stringToChartColor($color);
    }

    return $this;
}
public function setMarkerFillColor($color): static
{
    if (is_array($color)) {
        $this->markerFillColor = [];
        foreach ($color as $fillString) {
            if ($fillString instanceof ChartColor) {
                $this->markerFillColor[] = $fillString;
            } else {
                $this->markerFillColor[] = $this->stringToChartColor($fillString);
            }
        }
    } elseif ($color instanceof ChartColor) {
        $this->markerFillColor = $color;
    } else {
        $this->markerFillColor = $this->stringToChartColor($color);
    }

    return $this;
}

こんな感じにするとグラフ本体と同じ色になる。
さらに拡張して、マーカー本体と枠をそれぞれで色を指定したい場合、コンストラクタも以下のようにカスタマイズすると良い感じになる。
最終的に以下のようにした。

public function __construct(
    string $dataType = self::DATASERIES_TYPE_NUMBER,
    ?string $dataSource = null,
    ?string $formatCode = null,
    int $pointCount = 0,
    ?array $dataValues = [],
    ?string $marker = null,
    null|ChartColor|array|string $fillColor = null,
    int|string $pointSize = 3,
    // ここから追加
    null|ChartColor|array|string $markerFillColor = null,
    null|ChartColor|array|string $markerBorderColor = null,
    // ここまで追加
) {
    parent::__construct();
    // マーカーの色指定の初期値を自動にしてる
    $this->markerFillColor = new ChartColor();        
    // ここから追加
    if ($markerFillColor !== null) {
        $this->setMarkerFillColor($markerFillColor);
    }else{
    // ボーダーの色が指定されていれば、マーカーも同じ色にする
        if ($fillColor !== null) {
            $this->setMarkerFillColor($fillColor);
        }
    }
    // ここまで追加
    // マーカー枠の色指定の初期値を自動にしてる
    $this->markerBorderColor = new ChartColor();
    // ここから追加
    if ($markerBorderColor !== null) {
        $this->setMarkerBorderColor($markerBorderColor);
    }else{
    // ボーダーの色が指定されていれば、マーカーの枠線も同じ色にする
        if ($fillColor !== null) {
            $this->setMarkerBorderColor($fillColor);
        }
    }
    // ここまで追加
    $this->setDataType($dataType);
    $this->dataSource = $dataSource;
    $this->formatCode = $formatCode;
    $this->pointCount = $pointCount;
    $this->dataValues = $dataValues;
    $this->pointMarker = $marker;
    if ($fillColor !== null) {
        $this->setFillColor($fillColor);
    }
    if (is_numeric($pointSize)) {
        $this->pointSize = (int) $pointSize;
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0