だから、私のかなり長いコメントを答えに変えるために。
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' },
);
もちろん、これはただの迅速で汚い解決策です。モジュールのバグレポートを作成し、この質問/回答を作成者の参照として使用することを提案します。