Perlでxlsxファイルを出力する

2023/02/23更新

目次

概要

サーバー上のバッチプログラムで集計したデータをCSVファイルなどで出力することはよくあるだろう。だが、CSVのようなデータだけの状態だと、担当者に渡す前に「体裁を整えてxlsx形式に変換する」という手作業が発生する可能性がある。それなら、最初からxlsx形式が出力できればよい。ということで、ここではPerlでもxlsx形式のファイルが生成できることを示す。

Perlでxlsxファイルを生成するにはExcel::Writer::XLSXモジュールが便利である。このページは全てこのExcel::Writer::XLSXの使用法についての解説である。Excel::Writer::XLSXは以下よりダウンロードできる。

上記ドキュメント内の下記ページに膨大なサンプルが載っているので、参考にされたい。

基本

ワークブックの作成

新規xlsxファイルを作成するには以下のようにする。

# Excel::Writer::XLSXモジュールを使用
use Excel::Writer::XLSX;

# ワークブック作成
my $wb = Excel::Writer::XLSX->new('my_data.xlsx');

# 書き込みの終了
my $wb->close();

全ての書き込みが終わったら必ずclose()を呼んでおく。同名ファイルがすでに存在する場合は、そのファイルを開いて編集や追加ではなく、新規ファイルで完全に上書きになるので注意。

ファイルパスの代わりに、通常のopen()であらかじめ開いたファイルハンドルを渡すこともできる。

open(my $fh, '>', 'my_data.xlsx');
my $wb = Excel::Writer::XLSX->new($fh);

ファイルハンドルとして$fhの代わりに\*STDOUTとすれば標準出力に出力できる。

ワークシートの追加

ワークブックを作成したらまずはワークシートを追加する。

# ワークシートを追加
my $ws = $wb->add_worksheet();

# ワークシート名を指定して追加
my $ws = $wb->add_worksheet('Data');

値の書き込み

セルに値を書き込むには、write()を使う。

セルの位置は、行と列をそれぞれ0から始まる数字で指定する方法と、「A1」のような文字列で指定する方法がある。

$ws->set_column('A:B', 15);
$ws->write(0, 0, 'ここはA1セル');
$ws->write(1, 0, 'ここはA2セル');
$ws->write(0, 1, 'ここはB1セル');
$ws->write('B2', 'ここはB2セル');

値の書き込み

また、配列のリファレンスを用いて複数のセルを一度に書き込むこともできる。

$ws->write('A1', [
	['ここはA1セル', 'ここはA2セル'],
	['ここはB1セル', 'ここはB2セル']
]);

日本語の取り扱い

ワークシート名やセルの値に日本語を使う場合、add_worksheet()write()に渡す日本語の文字列は、UTF-8やShift_JISのバイト列ではなく、Perlの内部文字列でなければならない。

以下は、日本語が正常に書き込める例である。

  • Encode::decodeでリテラルのバイト列を内部文字列化して渡す。

    # ソースコードはUTF-8
    use Excel::Writer::XLSX;
    use Encode;
    
    my $wb = Excel::Writer::XLSX->new('my_data.xlsx');
    my $ws = $wb->add_worksheet(Encode::decode('utf-8', '日本語'));
    
  • ソースコードをUTF-8で記述し、use utf8;を使用して、リテラルで渡す。

    # ソースコードはUTF-8
    use Excel::Writer::XLSX;
    use utf8;
    
    my $wb = Excel::Writer::XLSX->new('my_data.xlsx');
    my $ws = $wb->add_worksheet('日本語');
    

以降のサンプルコードは全て、後者のuse utf8;の方法が取られているものとする。

全体のスタイル

列の幅

列の幅はset_column()で設定できる。0から始まる列番号でも範囲指定できる。

$ws->set_column('A:A', 20);
$ws->write('A1', 'A列は幅20');

$ws->set_column('B:D', 5);
$ws->write('B1', 'B列~D列は幅5');

$ws->set_column(4, 5, 3);
$ws->write('E1', 'E列~F列は幅3');

列の幅の指定

set_column()で指定する幅の数値の単位は、その幅に入る半角文字数とおよそ一致し、Excel上でセル幅をマウスで変更しようとしたときに表示される「幅:8.38(72ピクセル)」といったポップアップ表示の「8.38」の方の値に概ね一致する(フォントに依存するのでピッタリは一致しない模様)。

ポップアップ表示の「72ピクセル」の方の値で指定したい場合は、set_column_pixels()が使える(こちらも指定した値ピッタリには一致させられない模様)。

$ws->set_column_pixels('A:A', 160);
$ws->write('A1', 'A列は幅160ピクセル');

$ws->set_column_pixels('B:D', 40);
$ws->write('B1', 'B列~D列は幅40ピクセル');

$ws->set_column_pixels(4, 6, 24);
$ws->write('E1', 'E列~G列は幅24ピクセル');

行の高さ

行の高さはset_row()で設定できる。set_column()と異なり、こちらは1行ずつしか設定できない模様。

$ws->set_column(0, 0, 15);

$ws->set_row(0, 10);
$ws->write('A1', '行1は高さ10');

$ws->set_row(1, 20);
$ws->write('A2', '行2は高さ20');

$ws->set_row(2, 30);
$ws->write('A3', '行3は高さ30');

行の高さの指定

行の高さで指定する数値の単位は「ポイント」で、Excel上で行の高さをマウスで変更しようとしたときに表示される「高さ:13.50(18ピクセル)」といったポップアップ表示の「13.50」の方の値に概ね一致する(画面上では1ピクセル単位でしか変更できないため、ピッタリは一致しない模様)。

オートフィルター

絞り込みや並べ替えをするためのオートフィルターを適用するには、autofilter()を使う。

$ws->set_column(0, 2, 10);
$ws->write('A1', [
    ['項目1', 111, 1111, 11111],
    ['項目2', 222, 2222, 22222],
    ['項目3', 333, 3333, 33333]
]);

# 列A~Cにオートフィルターを適用
$ws->autofilter('A:C');

オートフィルターの適用

ただし、オートフィルターは適用される(上の画像のように1行目にプルダウンが表示される)が、オートフィルターで並べ替えをすることはできない模様。ただ、プログラムで出力するのだから、プログラム内であらかじめ並べ替えてから出力すれば特に困ることは少なさそうではある。

先頭行固定

データ数が多い場合などで、先頭行を固定表示にしたい場合は、freeze_panes()を使う。

$ws->set_column(0, 2, 10);
$ws->write('A1', [
    ['項目1', 111, 1111, 11111],
    ['項目2', 222, 2222, 22222],
    ['項目3', 333, 3333, 33333]
]);

# 先頭行を固定
$ws->freeze_panes(1, 0);

先頭行の固定

freeze_panes()は、第1引数が固定したい行数、第2引数が固定したい列数である。以下のような指定が可能である。

# 先頭1行を固定
$ws->freeze_panes(1, 0);

# 先頭1列を固定
$ws->freeze_panes(0, 1);

# 先頭1行と先頭1列を固定
$ws->freeze_panes(1, 1);

# 先頭2行と先頭3列を固定
$ws->freeze_panes(2, 3);

セルの書式

フォーマットの作成

セルに書式を指定するには、add_format()であらかじめ書式を表すオブジェクトを作り、それを値と一緒にwrite()に渡すことで指定する。この書式オブジェクトは、同じ書式であれば使い回すことができる。

my $format = $wb->add_format(color => 'red');
$ws->write('A1', '赤い文字', $format);

複数の書式を同時に指定することもできる。

my $format = $wb->add_format(color => 'red', bold => 1, size => 24);
$ws->write('A1', '赤くて太字でサイズ24', $format);

書式を後から追加するセッターのようなメソッドも存在する。

my $format = $wb->add_format();
$format->set_color('red');
$format->set_bold();
$format->set_size(24);

set_column()set_row()に渡して、列全体、行全体に指定することもできる。

# A列は全て文字色を赤色にする(第2引数のundefは「列幅を指定しない」の意)
$ws->set_column('A:A', undef, $wb->add_format(color => 'red'));

# 1行目は全て文字色を赤色にする(第2引数のundefは「行高を指定しない」の意)
$ws->set_row(0, undef, $wb->add_format(color => 'red'));

文字の書式

文字の色やフォントなどは以下のように指定する。

$ws->set_column(0, 0, 20);

$ws->write('A1', 'color => 10',         $wb->add_format(color => 10));
$ws->write('A2', 'bg_color => 10',      $wb->add_format(bg_color => 10));
$ws->write('A3', 'fg_color => 10',      $wb->add_format(fg_color => 10));
$ws->write('A4', 'bold => 1',           $wb->add_format(bold => 1));
$ws->write('A5', 'italic => 1',         $wb->add_format(italic => 1));
$ws->write('A6', 'underline => 1',      $wb->add_format(underline => 1));
$ws->write('A7', 'font => HGゴシックE', $wb->add_format(font => 'HGゴシックE'));
$ws->write('A8', 'size => 24',          $wb->add_format(size => 24));

セルの書式

bolditalicに渡す値は真偽値であるが、Perlなので1が真となる。

bg_colorfg_colorは、塗りのパターンの指定が無い場合はいずれもセルの背景色が設定される。

色は、'#000000'といったRGB値でも指定できるし、以下の色番号や色名でも指定できる。

$ws->set_column(0, 7, 5);
$ws->write(int($_ / 8), $_ % 8, "$_",
    $wb->add_format(bg_color => $_, align => 'center', valign => 'vcenter')
) for 0 .. 63;

色番号

上の画像は、0~63まで全ての色番号を背景色にしてみたもので、下はその中で定義済みの色名の一覧である。

色番号

色名

十進数

十六進数

8

0x08

black

9

0x09

white

10

0x0A

red

11

0x0B

lime

12

0x0C

blue

13

0x0D

yellow

14

0x0E

magenta

15

0x0F

cyan

16

0x10

brown

17

0x11

green

18

0x12

navy

20

0x14

purple

22

0x16

silver

23

0x17

gray

33

0x21

pink

53

0x35

orange

文字の位置

セル内の文字の位置は、水平方向はalign、垂直方向はvalignで指定できる。

$ws->set_column(0, 1, 20);
$ws->set_row($_, 30) for 0 .. 2;

$ws->write('A1', 'align => left',      $wb->add_format(align => 'left'));
$ws->write('A2', 'align => center',    $wb->add_format(align => 'center'));
$ws->write('A3', 'align => right',     $wb->add_format(align => 'right'));
$ws->write('B1', 'valign => top',      $wb->add_format(valign => 'top'));
$ws->write('B2', 'valign => vcenter',  $wb->add_format(valign => 'vcenter'));
$ws->write('B3', 'valign => bottom',   $wb->add_format(valign => 'bottom'));

文字位置の指定

文字の折り返し

長い文字列をセル内で折り返すには、text_wrapを指定する。

$ws->set_column('A:A', 10);
$ws->write('A1', '長い長い長い長い長い長い長い長い長い長い文字列');
$ws->write('A3', '長い長い長い長い長い長い長い長い長い長い文字列', $wb->add_format(text_wrap => 1));

文字の折り返し

未指定のA1セルは改行されずにはみ出しているが、text_wrapを指定したA3セルはセル内に収められている。

なお、セルに改行を含める場合は、\nで改行し、かつ、text_wrap => 1を指定するとうまくいくようである。

セルの罫線

上下左右の罫線を一度に指定するborderの他、toprightなどで個別に指定することもできる。値は0が罫線なし、1が通常の実線で、2~13は様々なスタイルの線となる。

罫線の色はborder_colorで指定できる(個別指定の場合は、top_colorright_colorなどがある)。

$ws->set_column($_, $_, 10) for 1, 3, 5, 7, 9;
$ws->set_column($_, $_, 3) for 0, 2, 4, 6, 8;

$ws->write($_ * 2 + 1, 1, "border => $_", $wb->add_format(border => $_)) for 0 .. 4;
$ws->write($_ * 2 + 1, 3, "top => $_",    $wb->add_format(top => $_))    for 0 .. 4;
$ws->write($_ * 2 + 1, 5, "right => $_",  $wb->add_format(right => $_))  for 0 .. 4;
$ws->write($_ * 2 + 1, 7, "bottom => $_", $wb->add_format(bottom => $_)) for 0 .. 4;
$ws->write($_ * 2 + 1, 9, "left => $_",   $wb->add_format(left => $_))   for 0 .. 4;

セルの罫線

数字の書式

数字の書式はnum_formatで指定できる。

$ws->set_column('A:A', 32);
$ws->set_column('B:B', 12);

$ws->write('A1', '小数点以下第3位まで表示');
$ws->write('B1', 123, $wb->add_format(num_format => '0.000'));

$ws->write('A2', '小数点以下第1位までの百分率で表示');
$ws->write('B2', 0.1234, $wb->add_format(num_format => '0.0%'));

$ws->write('A3', '「年4桁/月2桁/日2桁」の日付として表示');
$ws->write('B3', 36526, $wb->add_format(num_format => 'yyyy/mm/dd'));

$ws->write('A4', '「時2桁:分2桁:秒2桁」の時刻として表示');
$ws->write('B4', 45296 / 86400, $wb->add_format(num_format => 'hh:mm:ss'));

数字の書式の指定

日付や時刻の書式を効かせるには、文字列ではなく数値(日付なら1900/01/01からの日数、時刻なら1日を1とする割合値)で入力しなければならない。

# 日付の書式が効かず「2000/01/01」となってしまう(Excelに日付として認識されない)。
$ws->write('A1', '2000/01/01', $wb->add_format(num_format => 'dd mmm yyyy'));

# 日付の書式が効いて「01 Jan 2000」となる(Excelに日付として認識される)。
$ws->write('A2', 36526, $wb->add_format(num_format => 'dd mmm yyyy'));

あるいは、write_date_time()という日時入力専用のメソッドも存在する。ただし、「2000/01/01」などではダメで「2000-01-01T00:00:00.000」という形式でないと認識されないようだ。

# write_date_time()で日付を入力
$ws->write_date_time('A3', '2000-01-01T00:00:00.000', $wb->add_format(num_format => 'dd mmm yyyy'));

グラフ

基本

Excel::Writer::XLSXではグラフを作成することも可能で、しかもかなり細かい設定までサポートしている。機能が非常に多く全ては試せていないため、基本的な部分のみ解説する。

まずは、グラフを作成するためのほぼ最小限のコードは以下の通りである。

# データの準備
$ws->write('A1', [
    ['', '2020年', '2021年', '2022年', '2023年'], # A列
    ['系列A', 10, 70, 40, 80], # B列
    ['系列B', 20, 60, 50, 100] # C列
]);

# 縦棒グラフの作成
my $chart = $wb->add_chart(type => 'column', embedded => 1);

# 系列の追加
$chart->add_series(
    name       => '=Sheet1!$B$1',
    categories => '=Sheet1!$A$2:$A$5',
    values     => '=Sheet1!$B$2:$B$5'
);
$chart->add_series(
    name       => '=Sheet1!$C$1',
    categories => '=Sheet1!$A$2:$A$5',
    values     => '=Sheet1!$C$2:$C$5'
);

# ワークシートへの追加
$ws->insert_chart('D2', $chart, { x_offset => 8, y_offset => 8 });

上記のコードで以下のようなグラフが生成できる。

グラフの例

特に指定が無い場合、タイトルは表示されず、凡例は右に表示される。また、グラフの色などは自動的に選択される。

なお、系列が1つだけで凡例を表示させた場合、凡例には系列名ではなく項目名が表示され、タイトルが系列名となるようである。これは円グラフを考慮しての仕様かと思われるが、円グラフ以外のグラフに合うように系列名の表示にする方法は分からなかった。系列が2つ以上ある場合は問題無く系列名が表示される。

グラフの作成

グラフの作成は、Workbookオブジェクトのadd_chart()で行なう。

my $chart = $wb->add_chart(type => 'column', embedded => 1);

ワークシート上に追加する場合は、embedded => 1を指定する。指定しないと、グラフシートで作成される。

グラフの種類はtypesubtypeの2つのオプションで決定する。主に以下のようなものが指定できる。

type

subtype

グラフの種類

bar

(なし)

横棒グラフ

stacked

積み上げ横棒グラフ

percent_stacked

100%積み上げ横棒グラフ

column

(なし)

縦棒グラフ

stacked

積み上げ縦棒グラフ

percent_stacked

100%積み上げ縦棒グラフ

line

(なし)

折れ線グラフ

stacked

積み上げ折れ線グラフ

percent_stacked

100%積み上げ折れ線グラフ

pie

(なし)

円グラフ

scatter

(なし)

散布図

straight

散布図(直線)

straight_with_markers

散布図(直線とマーカー)

smooth

散布図(平滑線)

smooth_with_markers

散布図(平滑線とマーカー)

プロパティの指定方法

これ以降で説明するデータ系列の追加やグラフ要素の設定では、線や塗り、フォントなどの指定をする箇所が複数あるが、そこで指定するオブジェクトは共通の形式となっているため、先に説明しておく。

以下は、add_series()lineオプションで「線」のオブジェクトを使用し、「赤色で太さ5の線」を指定した例である。

$chart->add_series(
    name       => '=Sheet1!$B$1',
    categories => '=Sheet1!$A$2:$A$5',
    values     => '=Sheet1!$B$2:$B$5',
    line => { color => 'red', width => 5 }
);

「線」を指定するには以下のキーを持つオブジェクトを渡す。

キー

意味

color

線の色。文字の書式と同様にRGB値や色名で指定する。

width

線の太さ。

dash_type

線の種類。以下が選択できる。

  • solid

  • round_dot

  • square_dot

  • dash

  • dash_dot

  • long_dash

  • long_dash_dot

  • long_dash_dot_dot

「塗り」を指定するには以下のキーを持つオブジェクトを渡す。

キー

意味

color

塗りの色。文字の書式と同様にRGB値や色名で指定する。

「マーカー」を指定するには以下のキーを持つオブジェクトを渡す。

キー

意味

type

マーカーの種類。以下が選択できる。

  • automatic

  • none

  • square

  • diamond

  • triangle

  • x

  • star

  • short_dash

  • long_dash

  • circle

  • plus

size

マーカーの大きさ。

border

マーカーの線の設定。「線」のオブジェクトを渡す。

fill

マーカーの塗りの設定。「塗り」のオブジェクトを渡す。

「文字」を指定するには以下のキーを持つオブジェクトを渡す。

キー

意味

name

フォント名。

size

フォントサイズ。

color

文字色。文字の書式と同様にRGB値や色名で指定する。

bold

太字かどうか。太字にする場合は1。

italic

斜体かどうか。斜体にする場合は1。

underline

下線を引くかどうか。下線を引く場合は1。

rotation

時計回りに回転する角度(度)。

「位置」を指定するには以下のキーを持つオブジェクトを渡す。

キー

意味

x

横方向の位置。グラフエリアの左端を0、右端を1とする0~1の数値。

y

縦方向の位置。グラフエリアの上端を0、下端を1とする0~1の数値。

「位置とサイズ」を指定するには以下のキーを持つオブジェクトを渡す。

キー

意味

x

横方向の位置。グラフエリアの左端を0、右端を1とする0~1の数値。

y

縦方向の位置。グラフエリアの上端を0、下端を1とする0~1の数値。

width

幅。グラフエリアの幅を1とする0~1の数値。

height

高さ。グラフエリアの高さを1とする0~1の数値。

データ系列の追加

データ系列の追加は、add_chart()で作成したグラフオブジェクトのadd_series()で行なう。複数の系列を追加するには、複数回add_series()を呼び出す。円グラフの場合は、最初の1回のみが有効となるようである。

$chart->add_series(
    name       => '=Sheet1!$B$1',
    categories => '=Sheet1!$A$2:$A$5',
    values     => '=Sheet1!$B$2:$B$5'
);

引数には以下のオプションを渡す。

オプション名

意味

name

系列名。

categories

項目名の範囲。

  • 散布図の場合はxの値となる。

  • categoriesvaluesは、上記コード例のように指定する方法の他に、以下のように配列のリファレンス([シート名, 開始行, 終了行, 開始列, 終了列])で範囲を指定することもできる。

    $chart->add_series(
        name => '=Sheet1!$B$1',
        categories => [ 'Sheet1', 1, 4, 0, 0 ],
        values => [ 'Sheet1', 1, 4, 1, 1 ]
    );
    

values

項目に対する値の範囲。

  • 散布図の場合はyの値となる。

  • categoriesと同様に配列のリファレンスでも指定できる。

border

棒グラフの棒や円グラフの扇形の境界線。プロパティの指定方法で説明した「線」のオブジェクトを渡す。

fill

棒グラフの棒や円グラフの扇形の塗り。プロパティの指定方法で説明した「塗り」のオブジェクトを渡す。

line

折れ線グラフや散布図の線。プロパティの指定方法で説明した「線」のオブジェクトを渡す。

marker

折れ線グラフや散布図のマーカー。プロパティの指定方法で説明した「マーカー」のオブジェクトを渡す。

points

borderfillmarkerを個別に設定。{ border => { ~ }, fill => { ~ } }といったオブジェクトまたはundefを項目数の分だけ配列のリファレンスにして渡す。

  • 棒グラフは棒1つずつ、円グラフは扇形1つずつ、折れ線グラフと散布図はマーカー1つずつが個別に設定される。

smooth

折れ線グラフで線を滑らかにするかどうか。滑らかにする場合はsmooth => 1とする。

グラフ要素の設定

軸や目盛線は、set_x_axis()set_y_axis()で設定できる。

$chart->set_y_axis(
    name => '売上'
    min => 0,
    max => 10000
);

引数には以下のオプションを渡す。

オプション名

意味

name

軸名。

name_font

軸名のフォント。プロパティの指定方法で説明した「文字」のオブジェクトを渡す。

name_layout

軸名の位置。プロパティの指定方法で説明した「位置」のオブジェクトを渡す。

num_font

数値のフォント。プロパティの指定方法で説明した「文字」のオブジェクトを渡す。

num_format

数値の書式。数字の書式を参照。

line

軸の線。プロパティの指定方法で説明した「線」のオブジェクトを渡す。

min

最小値。

max

最大値。

major_tick_mark

主目盛の有無。以下が選択できる。

  • none

  • inside

  • outside

  • cross

major_unit

主目盛の刻み幅。

major_gridlines

主目盛の線。以下のキーを持つオブジェクトを渡す。

  • visible … 線を表示する場合は1を指定。

  • line … プロパティの指定方法で説明した「線」のオブジェクトを渡す。

minor_tick_mark

補助目盛の有無。指定できる値はmajor_tick_markと同じ。

minor_unit

補助目盛の刻み幅。

minor_gridlines

補助目盛の線。指定方法はmajor_grid_linesと同じ。

グラフのタイトルは、set_title()で設定できる。

$chart->set_title(
    name => '年ごとの売上の比較'
);

引数には以下のオプションを渡す。

オプション名

意味

name

グラフのタイトル。

name_font

フォント。プロパティの指定方法で説明した「文字」のオブジェクトを渡す。

overlay

プロットエリアに重ねるかどうか。重ねる場合は1。

layout

タイトルの位置。プロパティの指定方法で説明した「位置」のオブジェクトを渡す。

none

タイトルを表示しない場合は1。

グラフの凡例は、set_legend()で設定できる。

$chart->set_legend(
    position => 'overlay_top_right'
);

引数には以下のオプションを渡す。

オプション名

意味

position

凡例の位置。以下が選択できる。

  • top

  • bottom

  • left

  • right

  • top_right

  • overlay_left

  • overlay_right

  • overlay_top_right

font

凡例のフォント。プロパティの指定方法で説明した「文字」のオブジェクトを渡す。

border

凡例の境界線。プロパティの指定方法で説明した「線」のオブジェクトを渡す。

fill

凡例の塗り。プロパティの指定方法で説明した「塗り」のオブジェクトを渡す。

layout

凡例の位置とサイズ。プロパティの指定方法で説明した「位置とサイズ」のオブジェクトを渡す。

none

凡例を表示しない場合は1。

プロットエリアset_plotarea()で設定できる。引数には以下のオプションを渡す。

オプション名

意味

border

プロットエリアの境界線。プロパティの指定方法で説明した「線」のオブジェクトを渡す。

fill

プロットエリアの塗り。プロパティの指定方法で説明した「塗り」のオブジェクトを渡す。

layout

プロットエリアの位置とサイズ。プロパティの指定方法で説明した「位置とサイズ」のオブジェクトを渡す。

グラフエリアset_chartarea()で設定できる。引数には以下のオプションを渡す。

オプション名

意味

border

グラフエリアの境界線。プロパティの指定方法で説明した「線」のオブジェクトを渡す。

fill

グラフエリアの塗り。プロパティの指定方法で説明した「塗り」のオブジェクトを渡す。

ワークシートへの追加

グラフが作成できたら、最後にWorksheetオブジェクトのinsert_chart()でワークシートに挿入する。

$ws->insert_chart('D2', $chart, {
    x_offset => 8,
    y_offset => 8
});

1つ目の引数は挿入する場所のセル、2つ目の引数が作成したグラフオブジェクトで、3つ目の引数には任意で以下のキーを持つオブジェクトを渡す。

キー

意味

x_offset

指定したセルの左上から何ピクセル右にずらすかを指定する。

y_offset

指定したセルの左上から何ピクセル下にずらすかを指定する。

x_scale

デフォルトの幅に対して、何倍の大きさにするかを指定する。

y_scale

デフォルトの高さに対して、何倍の大きさにするかを指定する。

デフォルトでは480×288ピクセルで作成されるとドキュメントには書かれていたが、私の環境では何も指定しない場合、約540×260ピクセルくらいであった。グラフオブジェクトのset_size()というメソッドでwidthheightをピクセルで直接指定する方法もあるようだが、こちらも同じく指定した通りの正確なピクセル数にはならず、正確なサイズを指定する方法は分からなかった。

その他

数式

セルに書き込むwrite()メソッドで、通常のExcel同様に=から始まる数式も入力できる。

$ws->write('A1', '数値A');
$ws->write('B1', '数値B');
$ws->write('C1', '数値C');
$ws->write('D1', '合計');
$ws->write('E1', '平均');
for (my $i = 1; 4 >= $i; $i++) {
	my $n = $i + 1;
	$ws->write($i, 0, int(rand(100)));
	$ws->write($i, 1, int(rand(100)));
	$ws->write($i, 2, int(rand(100)));
	$ws->write($i, 3, "=SUM(A$n:C$n)");
	$ws->write($i, 4, "=AVERAGE(A$n:C$n)");
}

数式の入力

条件付き書式(未稿)

条件付き書式の指定もできるようであるが、まだ試せていない。

ただ、これもオートフィルターの並べ替えと同じで、そもそもプログラムで生成しているのだから、プログラムで条件の判断をすればいいのであって、Excelの条件付き書式をわざわざ使用しなければいけない場面は少ないかもしれない。

その他(未稿)

他にもまだ多数のExcelの機能に対応しているようである。

外部リンク