2

積み上げ棒グラフを含む Excel シートを作成します。最初のバーに色を付けたくないのですが、まだ青です。コードは次のようになります。

$chart->add_series(
    categories    => [ 'Sheet1', 1, $counter, 0, 0 ],
    values        => [ 'Sheet1', 1, $counter, 3, 3 ],
    name          => 'Waiting_time',
    fill          => { none => 1 },
    border        => { none => 1 },
);

Excel::Writer::XLSXのバージョン 0.5 を使用しています

ご協力いただきありがとうございます。

4

2 に答える 2

1

だから、私のかなり長いコメントを答えに変えるために。

Excel :: Writer::XLSXに何かが欠けているようです。

ExcelのグラフのプロパティウィンドウでXLSXファイルを見ると、塗りつぶしの色は「青」ですが、境界線は「なし」に設定されていることがわかります。それは素晴らしいことですが、境界線が欠落していることや、塗りつぶしと同じ色であることがわからないため、気付かないでしょう。

とにかく、塗りつぶしは機能しないようです。Excel :: Writer :: XLSXによって生成されたXLSXアーカイブ内のchart.xmlを確認し、Excelで「塗りつぶしなし」に変更して保存したものと比較しました。Excelによって作成されるオーバーヘッドはたくさんありますが、要約すると次のようになります。

<!-- Perl -->
<c:spPr>
  <a:solidFill></a:solidFill>
  <a:ln>
    <a:noFill />
  </a:ln>
</c:spPr>

<!-- after Excel -->
<c:spPr>
  <a:noFill/>
  <a:ln>
    <a:noFill/>
  </a:ln>
</c:spPr>

要素があるはずだということがはっきりとわかりますnoFill

ここで、Excel :: Writer :: XLSX :: Chartのコードを見ると、。というメソッドがあり_write_sp_prます。これはチャートを物事にします。2つのメソッドを順番に呼び出します。1つは行用、もう1つは塗りつぶし用です。

# Write the a:solidFill element for solid charts such as pie and bar.
if ( $series->{_fill}->{_defined} ) {
    $self->_write_a_solid_fill( $series->{_fill} );
}

# Write the a:ln element.
if ( $series->{_line}->{_defined} ) {
    $self->_write_a_ln( $series->{_line} );
}

2番目のものは:_write_a_lnの世話をしnone => 1ます

sub _write_a_ln {
    # [...]

    # Write the line fill.
    if ( $line->{none} ) {

        # Write the a:noFill element.
        $self->_write_a_no_fill();
    }

    # [...]
}

これは素晴らしい。したがって、線はありません。しかし、塗りつぶしの色のチェックはどこにありますか?

sub _write_a_solid_fill {

    my $self = shift;
    my $line = shift;

    $self->{_writer}->startTag( 'a:solidFill' );

    if ( $line->{color} ) {

        my $color = $self->_get_color( $line->{color} );

        # Write the a:srgbClr element.
        $self->_write_a_srgb_clr( $color );
    }

    $self->{_writer}->endTag( 'a:solidFill' );
}

結局のところ、何もありません。カラーセットがない場合は省略されます。ただし、これにより、Excelはデフォルトの色(青である必要があります)を使用するようになります。


これを修正するには、次のモンキーパッチを試してください。チャートを含むXLSXファイルを作成するプログラムの先頭にこのようなものを追加します。それは無充填の世話をします。これは、元のモジュールコードからの完全なサブ_write_sp_prであり、追加のロジックが少し混合されています。

use Excel::Writer::XLSX;
{
  no warnings 'redefine';
  sub Excel::Writer::XLSX::Chart::_write_sp_pr {

      my $self   = shift;
      my $series = shift;

      if ( !$series->{_line}->{_defined} and !$series->{_fill}->{_defined} ) {
          return;
      }

      $self->{_writer}->startTag( 'c:spPr' );

      # Write the a:solidFill element for solid charts such as pie and bar.
      if ( $series->{_fill}->{_defined} ) {
          # Check if a noFill element is needed
          if ( $series->{_fill}->{none} ) {
              # Write the a:noFill element.
              $self->_write_a_no_fill();
          } else {
              # Write the line fill.
              $self->_write_a_solid_fill( $series->{_fill} );
          }
      }

      # Write the a:ln element.
      if ( $series->{_line}->{_defined} ) {
          $self->_write_a_ln( $series->{_line} );
      }

      $self->{_writer}->endTag( 'c:spPr' );
  }
}

これを実際にすばやく試すためのもう少しコードがあります。

use strict; use warnings;
#### put above code here 

# Create a new Excel workbook
my $workbook = Excel::Writer::XLSX->new( 'perl.xlsx' );

# Add a worksheet
my $worksheet = $workbook->add_worksheet();
foreach my $row (0 .. 9) {
  foreach my $col (0 .. 4) {
    $worksheet->write($row, $col, $row+1);
  }
}

my $chart = $workbook->add_chart( type => 'bar' );
$chart->add_series(
    categories    => [ 'Sheet1', 1, 5, 0, 0 ],
    values        => [ 'Sheet1', 1, 5, 3, 3 ],
    name          => 'Waiting_time',
    fill          => { none => 1 },
    border        => { color => 'red' },
);

もちろん、これはただの迅速で汚い解決策です。モジュールのバグレポートを作成し、この質問/回答を作成者の参照として使用することを提案します。

于 2012-09-12T12:48:43.473 に答える
0

@simbabque が言うように、これはバグです。

Github の master ブランチで修正しました ( commit f4e4191e )。

おそらく次の 2 週間で 0.51 のリリースが予定されています。

更新: Excel::Writer::XLSX のバージョン 0.51 で修正されました。

于 2012-09-12T23:06:49.283 に答える