end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Spreadsheet::WriteExcelで積み上げ棒グラフを表示

2013/11/23追記

当時は、種類を混合したグラフ作成に苦労しましたが、Spreadsheet::WriteExcel の後継である Excel::Writer::XLSX なら add_chart() に subtypeを指定できるので、混合グラフも問題なく作成できそうです。
http://search.cpan.org/perldoc?Excel%3A%3AWriter%3A%3AXLSX

 my $chart = $workbook->add_chart( type => 'bar', subtype => 'stacked' );


Spreadsheet::WriteExcelで積み上げ棒+折れ線グラフを表示したかったのですが、積み上げ棒までなら表示できたので、その方法を書き留めておきます。

積み上げ棒+折れ線グラフ(やりたかったグラフ)

積み上げ棒グラフ(ここまでならできたグラフ)


Spreadsheet::WriteExcel ver.2.37では、7種類のグラフ出力に対応

http://search.cpan.org/perldoc?Spreadsheet::WriteExcel

Spreadsheet::WriteExcel ver.2.37では、棒グラフや折れ線グラフ等、7種類のグラフ出力に対応していますが、等高線やドーナツ等、対応できていないグラフもあります。

excelの対応グラフ一覧


Spreadsheet::WriteExcel ver.2.37の対応グラフ
  • area(積上げ面)
  • bar(集合横棒)
  • column(縦棒)
  • line(集合折れ線)
  • pie(円)
  • scatter(散布)
  • stock(株価)

Spreadsheet::WriteExcel::Chart以下にサブクラスを作成して未対応グラフ表示

今回、Spreadsheet::WriteExcelで積上げ棒グラフを出力する必要がありましたが、次のurlを参考に Spreadsheet::WriteExcel::Chart::Column から、Spreadsheet::WriteExcel::Chart::Stacked クラスを作成しました。
※「参考に」と言っても、ほぼそのまま流用しています。
※実際の出力方法は、Spreadsheet::WriteExcelのsrcをご覧ください。

http://yassblog.blog.so-net.ne.jp/2010-08-02-1

package Spreadsheet::WriteExcel::Chart::Stacked;

require Exporter;

use strict;
use Spreadsheet::WriteExcel::Chart;

use vars qw($VERSION @ISA);
@ISA = qw(Spreadsheet::WriteExcel::Chart Exporter);

$VERSION = '2.37';

sub new {

    my $class = shift;
    my $self  = Spreadsheet::WriteExcel::Chart->new( @_ );

    bless $self, $class;
    return $self;
}


sub _store_chart_type {

    my $self = shift;

    my $record    = 0x1017;    # Record identifier.(棒グラフと同じ)
    my $length    = 0x0006;    # Number of bytes to follow.
    my $pcOverlap = 0xff9c;    # Space between bars (-100%).
    my $pcGap     = 0x0096;    # Space between cats.
    my $grbit     = 0x0002;    # Option flags (bit1 indicates fStacked).

    my $header = pack 'vv', $record, $length;
    my $data = '';
    $data .= pack 'v', $pcOverlap;
    $data .= pack 'v', $pcGap;
    $data .= pack 'v', $grbit;

    $self->_append( $header, $data );
}

1;
__END__

http://www.wotsit.org/ では様々なfile仕様が掲載

先程の yassblog.blog.so-net.ne.jp によれば、
様々なファイル仕様が http://www.wotsit.org/ に掲載されています。
今回は時間がなかったので、詳しく読んでいませんが、本気で積み上げ棒+折れ線グラフを表示する際に役に立つかも。