by Hippo2000(2001/9/30)
もはやPerlではCSVファイルよりExcelファイルに出力する方が簡単!と思わせるようなモジュール。
Linuxでも気にせずExcelファイルが作れます、漢字だってSJISに変換すればOK!
作者はJohn McNamaraさんです。メールで翻訳の許可をいただいています。
Spreadsheet::WriteExcel - クロス・プラットフォームなExcelバイナリ・ファイルを出力
このドキュメントは2001年7月30日にリリースされた、Spreadsheet::WriteExcel バージョン0.33を記述しています。
perl.xlsというExcelワークブックの最初のワークシートに文字列、書式付の文字列、数値、それ式を書き込むためには以下のようにします:
use Spreadsheet::WriteExcel;
# 新しいExcelワークブックの作成
my $workbook = Spreadsheet::WriteExcel->new("perl.xls");
# ワークシートの追加
$worksheet = $workbook->addworksheet();
# 書式の追加と定義
$format = $workbook->addformat(); # 書式の追加
$format->set_bold();
$format->set_color('red');
$format->set_align('center');
# 行、列の書き方で書式付とそうでない文字列を出力
$col = $row = 0;
$worksheet->write($row, $col, "Hi Excel!", $format);
$worksheet->write(1, $col, "Hi Excel!");
# A1という書き方を使って、数字と式を出力
$worksheet->write('A3', 1.2345);
$worksheet->write('A4', '=SIN(PI()/4)');
Spreadsheet::WriteExcelモジュールを使ってネイティブなExcelバイナリ・ファイル・フォーマットで数字やテキストを出力することができます。複数のワークシートをワークブックに追加したり、セルに書式を適用することもできます。テキスト、数値、式そしてハイパーリンクをセルに書き込むことができます。
このモジュールによって作成されるExcelファイルはExcel5、95、97そして2000と互換性があります。
このモジュールはWindows、UNIXそしてMacintoshプラットホームの多くで機能します。作成されたファイルはLinux/UNIXスプレッドシート・アプリケーションであるOpenOffice、Gnumeric そして XESSと互換性があります。
このモジュールを使って既存のExcelファイルに出力することは出来ません。
(訳者注:既存のExcelファイルを読み込んでということです。上書きはできます。)
Spreadsheet::WriteExcelはできるだけ多くのExcelの機能のインターフェースを提供しようとしています。その結果、インターフェースに一緒になるドキュメントがたくさんあり、ぱっと見ただけでは何が重要でそうでないかをわかるのは難しいかもしれません。そこでIkea の家具をまず組み立て、それから手順書を読むることを好む人のために、以下に3つの簡単なステップを示します:
1. new()を使って新しいExcelワークブック(つまりファイル)を作成します。
2. addworksheet()を使って新しいワークブックにワークシートを追加します。.
3. write()を使ってワークシートに書き込みます。
このようになります::
use Spreadsheet::WriteExcel; # Step 0
$workbook = Spreadsheet::WriteExcel->new("perl.xls"); # Step 1
$worksheet = $workbook->addworksheet(); # Step 2
$worksheet->write('A1', "Hi Excel!"); # Step 3
これはセルに"Hi Excel!"と入った1つのワークシートを持つperl.xlsというExcelファイルを作成します。以上。たしかに、0番目のステップがありました、しかしuse モジュールはいうまでもないでしょう。ディストリビューションと一緒に、あなたが始める使うことが出来る20以上の例が入っています。EXAMPLESをご覧ください。
まず最初に手順を読んだ後に家具を組み立てる人は、先への進み方がわかっていることでしょう。 :-)
Spreadsheet::WriteExcelモジュールは新しいExcelワークブックへのオブジェクト指向なインターフェースを提供します。以下のメソッドが新しいworkbookを通じて利用できます。
new()
close()
addworksheet($sheetname)
addformat()
worksheets()
set_1904()
もしオブジェクト指向なインターフェースやPerlでの実装されているその方法に慣れていないのであれば、メインのPerlドキュメントにあるperlobjとperltootをご覧ください。
新しいExcelワークブックはnew()コンストラクタを使って作成されます。それはファイル名またはファイルハンドルをパラメータとして受け付けます。以下の例は新しいExcelファイルをファイル名をベースに作成します:
my $workbook = Spreadsheet::WriteExcel->new('filename.xls');
my $worksheet = $workbook->addworksheet();
$worksheet->write(0, 0, "Hi Excel!");
ファイル名でnew()を使ったさらにいくつかの例を示します:
my $workbook1 = Spreadsheet::WriteExcel->new($filename);
my $workbook2 = Spreadsheet::WriteExcel->new("/tmp/filename.xls");
my $workbook3 = Spreadsheet::WriteExcel->new("c:\\tmp\\filename.xls");
my $workbook4 = Spreadsheet::WriteExcel->new('c:\tmp\filename.xls');
最後の2つの例は、ディレクトリの区切り\でおかしくならないようにエスケープするかシングル・クォートを使う必要があるDOSまたはWindowsでファイルを作成する方法について示しています。さらに情報についてはperlfaq5: DOSパスで"C:\temp\foo"を使えないのはなぜですか? をご覧ください。
ワークシートを追加したり、データを格納するために使うことが出来るnew()コンストラクタはSpreadsheet::WriteExelオブジェクトを返します。新しいワークブック変数のスコープを定義するmyは特に必要ではありませんが、多くの場合、明示的にclose()メソッドを呼び出すことなく、ワークブックが閉じられることを保証するということは注意されるべきことでしょう。
new()コンストラクタに適切なファイル・ハンドルを渡すことも出来ます。例えばCGIプログラウでは、以下のようなことが出来るでしょう:
binmode(STDOUT);
my $workbook = Spreadsheet::WriteExcel->new(\*STDOUT);
binmode()の必要性については後で説明します。
CGIプログラムでは、出力をSTDOUTにリダイレクトする特別なPerlファイル名'-'を使うことも出来ます:
my $workbook = Spreadsheet::WriteExcel->new('-');
ディストリビューションのexamplesディレクトリにあるcgi.plもご覧ください。しかし、この特別なケースはmod_perlプログラムでは動きません。そこでは以下のようにする必要があります:
tie *XLS, 'Apache';
binmode(XLS);
my $workbook = Spreadsheet::WriteExcel->new(\*XLS);
ファイルハンドルはソケットを介してExcelファイルをストリームしたいとき、あるいはExcelファイルをtieされたスカラに格納するときにも便利でしょう。ファイルハンドルでSpreadsheet::WriteExcelを使っているいくつかの例については、ディストリビューションのexamplesディレクトリにあるfilehandle.plをご覧ください。
binmode()の必要性についてご注意ください。Excelファイルはバイナリ・データで構成されています。このためファイルハンドルを使っているならば、new()に渡す前に確実にbinmode()してください。これはあなたのプラットフォームがそれを必要とするかに関係なくやるべきです。binmode()についてのよりさらなる情報は、メインのPerlドキュメンテーションの中ののperlfuncとperlopentutをご覧ください。ファイル名にbinmode()する必要が無いということは気がつくことは同じくらい重要です。実際には、それはエラーを起こします。Spreadsheet::WriteExcelは内部的にファイル名からファイルハンドルに変換するときにbinmode()を行います。
close()メソッドはExcelファイルを明示的にクローズするために使うことができます。
$workbook->close();
もしそれに対して何らかの外部的なアクション、例えばコピーしたりその大きさを読み込んだりといったことをする前にクローズしなければならない場合には、明示的なclose()が必要です。
さらにclose()はWorkbook、WorksheetまたはFormatオブジェクトのスコープがperlによって判定できない場合には必要かもしれません。そのようなことが起こる状況にはいかものがあります:
このためSpreadsheet::WriteExcelは、特定のシーケンスでのデストラクタ・メソッドのトリガーとしてPerlのDESTROYサブルーチンを信頼しています。これは変数のスコープが判定できなければ、発生しません。
一般的に大きさ0のファイルを作成するとclose()を呼び出さなければなりません。
少なくとも1つのワークシートが新しいワークブックに追加されなければなりません。ワークシートはセルにデータを出力するために使われます:
$worksheet1 = $workbook->addworksheet(); # Sheet1
$worksheet2 = $workbook->addworksheet('Foglio2'); # Foglio2
$worksheet3 = $workbook->addworksheet('Data'); # Data
$worksheet4 = $workbook->addworksheet(); # Sheet4
もし$sheetnameが指定されなければ、デフォルトのExcelでの書き方に従います。つまりSheet1、Sheet2など
addformat()メソッドは新しいFormatメソッドを作成するために使うことができます。それはセルへの書式設定をするために使われます。プロパティ値のハッシュによって作成時にプロパティを定義することも、後からメソッド呼び出しによって後からしていすることも出来ます。
$format1 = $workbook->addformat(%props); # 作成時にプロパティを設定
$format2 = $workbook->addformat(); # 後からプロパティを設定
Formatのプロパティどどのようにそれを設定するかについての詳細はセルの書式設定セクションをご覧ください。
worksheets()メソッドはワークブック中のワークシートの配列へのリファレンスを返します。ワークブック中の各ワークシートに処理を繰り返したり、インデックスでワークシートを参照したいときに便利でしょう:
foreach $worksheet (@{$workbook->worksheets()}) {
$worksheet->write(0, 0, "Hello");
}
# or:
$worksheets = $workbook->worksheets();
@$worksheets[0]->write(0, 0, "Hello");
リファレンスはメインのPerlドキュメントのperlrefとperlreftutで詳しく説明されています。
Excelは日付を実数で格納し、整数部分が開始日(epoch)からの日数を、小数部分が1日でのパーセンテージを表します。開始日は1900年または1904年のどちらかにすることができます。Windows用のExcelは1900年をMacintosh用のExcelは1904年を使用します。しかし、どちらのプラットホームのExcelも一方のシステムから他方へ自動的に変換されます。
Spreadsheet::WriteExcelはデフォルトでは1900年形式で日付を格納します。もしこれを変更したければset_1904()ワークブック・メソッドを読んでください。現在の値はget_1904()ワークブック・メソッドを呼ぶことによって問い合わせることができます。1900年であれば0、1904年であれば1を返します。
Excel日付システムを利用するためのさらなる情報についてはExcelでの日付をご覧ください。
一般的にはおそらくset_1904()を使う必要はないでしょう。
新しいワークシートはwokbookオブジェクトからaddworksheet()メソッドを呼び出すことによって作成されます:
$worksheet1 = $workbook->addworksheet();
$worksheet2 = $workbook->addworksheet();
以下のメソッドが新しいworksheetを通じて利用することができます:
write()
write_number()
write_string()
write_formula()
write_blank()
write_url()
get_name()
activate()
select()
set_first_sheet()
set_selection()
set_row()
set_column()
freeze_panes()
thaw_panes()
merge_cells()
Spreadsheet::WriteExcel は2つのセルの位置を示す書き方として2つの書式をサポートしています:行-列記法とA1記法です。
行-列記法は、行と列の両方に0始まりのインデックスを使い、A1記法はExcelでの標準である列を英字、行を1始まりの英数字並びを使います。例えば:
(0, 0) # 左上のセルの行-列記法。
('A1') # 左上のセルのA1記法。
(1999, 29) # 行-列記法
('AD2000') # 同じセルをA1記法で。
行-列記法は、プログラム的にセルを参照するときに便利です:
for my $i (0 .. 9) {
$worksheet->write($i, 0, 'Hello'); # A1 から A10 のセル
}
A1 記法は、手でワークシートを設定したり、式を使うときに便利です:
$worksheet->write('H1', 200);
$worksheet->write('H2', '=H7+1');
ディストリビューションのexamplesディレクトリに、convertA1.plというプログラムがあります。それにはA1記法をあうかうためのヘルパー関数が入っています、例えば:
cell_to_rowcol('B7'); # (6, 1)を返す
rowcol_to_cell(6, 1), # "B7"を返す
単純にするため、以下のセクションでのworksheetメソッド呼び出しためのパラメータリストは行-列記法で与えられています。すべての場合、A1記法も使うことが出来ます。
write()メソッドはExcelでのセルへの出力の数多くのメソッドの汎用的な別名です。write()呼出しは$tokenの値によって、以下のメソッドを呼び出します:
もし$tokenが以下の正規表現を元にした数値であればwrite_number():$token
=~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/
もし$tokenが文字列""または''であればwrite_blank()
もし$tokenが以下の正規表現を元にしたURLであればwrite_url():$token =~ m|^[fh]tt?p://|
or $token =~ m|^mailto:|
もし$tokenの最初の文字が=であればwrite_formula()
もし上記のいずれも適用されなければwrite_string()。
以下に例を示します:
以下に行-列記法とA1記法の両方でのいくつかの例を示します:
$worksheet->write(0, 0, "Hello" ); # write_string()
$worksheet->write('A2', 'One' ); # write_string()
$worksheet->write(2, 0, 2 ); # write_number()
$worksheet->write('A4', 3.00001 ); # write_number()
$worksheet->write(4, 0, "" ); # write_blank()
$worksheet->write('A6', '' ); # write_blank()
$worksheet->write(6, 0, 'http://www.perl.com/' ); # write_url()
$worksheet->write('A8', 'ftp://ftp.cpan.org/' ); # write_url()
$worksheet->write(8, 0, '=A3 + 3*A4' ); # write_formula()
$worksheet->write('A10', '=SIN(PI()/4)' ); # write_formula()
$format引数はオプションです。これは正しいFormatオブジェクトでなければなりません。セルの書式設定をご覧ください:
my $format = $workbook->addformat();
$format->set_bold();
$format->set_color('red');
$format->set_align('center');
$worksheet->write(4, 0, "Hello", $format ); # 書式付の文字列
writeメソッドは以下の値を返します:
0 正常終了 -1 引数の数が足りない -2 行または列が範囲を超えている -3 文字列が長すぎる
整数または浮動小数点数を$rowと$columnで指定されたセルに出力します:
$worksheet->write_number(0, 0, 1 );
$worksheet->write_number('A2', 2.3451);
セル記法.についての注意をご覧ください。$formatパラメータはオプションです。
文字列を$rowと$columnで指定されたセルに出力します:
$worksheet->write_string(0, 0, "Your text here" );
$worksheet->write_string('A2', "or here" );
セル記法.についての注意をご覧ください。文字列の最大長は255文字(訳者注:255バイト)です。$formatパラメータはオプションです。
式または関数を$rowと$columnで指定されたセルに出力します:
$worksheet->write_formula(0, 0, '=$B$3 + B4' );
$worksheet->write_formula(1, 0, '=SIN(PI()/4)');
$worksheet->write_formula(2, 0, '=SUM(B1:B5)' );
$worksheet->write_formula('A4', '=IF(A3>1,"Yes", "No")' );
$worksheet->write_formula('A5', '=AVERAGE(1, 2, 3, 4)' );
$worksheet->write_formula('A6', '=DATEVALUE("1-Jan-2001")');
セル記法.についての注意をご覧ください。Excelでの式の書き方についての更なる情報はEXCELでの式と関数 をご覧ください。
空白を$rowと$columnで指定されたセルに出力します:
$worksheet->write_blank(0, 0, $format);
セル記法.についての注意をご覧ください。このメソッドは文字列または数値の値が入っていないセルに書式を追加するときに便利です。
ハイパーリンクを$rowと$columnで指定されたセルに出力します。そのハイパーリンクは2つの要素を含みます:目に見えるラベルと目に見えないリンクです。目に見えるラベルは代替文字列が指定されなければリンクと同じです。$formatと代替文字列$stringはオプションです。0.33からは、$stringなしに、指定しない引数をundefで置き換えることなしに、$formatを使うことが出来ます。
$worksheet->write_url(0, 0, 'http://www.perl.com/' );
$worksheet->write_url(1, 0, 'http://www.perl.com/', 'Perl home' );
$worksheet->write_url('A3', 'http://www.perl.com/', $format );
$worksheet->write_url('A4', 'http://www.perl.com/', 'Perl', $format);
$worksheet->write_url('A5', 'mailto:jmcnamara@cpan.org' );
ラベルはwrite_string()を使って書かれます。このため255文字の文字列限界がラベルにも適用されます:URLはどのような長さにすることもできます。
セル記法.についての注意をご覧ください。
注意:ハイパーリンクはExcel5では使えません。文字列としてだけ現れます。
get_name()メソッドはワークシートの名前を取り出すために使われます。例えば:
foreach my $worksheet (@{$workbook->worksheets()}) {
print $worksheet->get_name(), "\n";
}
activete()メソッドはどのワークシートが複数シートのワークブックで始めに見えるかを指定します:
$worksheet1 = $workbook->addworksheet('To');
$worksheet2 = $workbook->addworksheet('the');
$worksheet3 = $workbook->addworksheet('wind');
$worksheet3->activate();
これはExcel VBAのactiveメソッドと同じです。selectメソッドによって複数のワークシートを選択することができますが、1つのワークシートだけがアクティブになります。デフォルト値は最初のワークシートです。
select()メソッドは複数シートのワークブックでワークシートが選択されていることを示すために使われます:
$worksheet1->activate();
$worksheet2->select();
$worksheet3->select();
選択されたワークシートはそのタブが明るくなります。ワークシートを選ぶことは、例えばいくつかのワークシートを一緒に印刷することができるようにするなどのように、一緒にグループにするための方法です。ワークシートはactivate()メソッドを通してアクティブになったワークシートはselectされたようにも表されます。おそらくselect()メソッドをそれほど頻繁に使う必要はないでしょう。
activate()メソッドは始めにどのワークシートが選択されるかを決定します。しかしもし多くのワークシートがある場合、選択されているシートは画面上に現れないかもしれません。これを避けるため、set_first_sheet()を使って最も左の見えるワークシートに選択することができます:
for (1..20) {
$workbook->addworksheet;
}
$worksheet21 = $workbook->addworksheet();
$worksheet22 = $workbook->addworksheet();
$worksheet21->set_first_sheet();
$worksheet22->activate();
このメソッドはあまり頻繁には必要とされません。デフォルト値は最初のワークシートです。
このメソッドはワークシートのなかでどのセルや領域が選択されるかを指定するために使われます。最も一般的な必要性は1つのセルを選択することです。その場合には$last_rowと$last_colは必要ありません。選択された領域でのアクティブなセルは$firstと$lastが指定された順序に依存します。A1記法を使ってセルや範囲を指定することも可能です。セル記法.についての注意をご覧ください:
例:
$worksheet1->set_selection(3, 3); # 1. セルD4.
$worksheet2->set_selection(3, 3, 6, 6); # 2. セル範囲 D4 から G7.
$worksheet3->set_selection(6, 6, 3, 3); # 3. セル範囲 G7 から D4.
$worksheet4->set_selection('D4'); # 1.と同じ
$worksheet5->set_selection('D4:G7'); # 2.と同じ
$worksheet6->set_selection('G7:D4'); # 3.と同じ
デフォルトはセル(0,0)です。
このメソッドは行の高さを指定するために使われます。$format引数は追加の情報のためのオプションです。セルの書式設定をご覧ください。
$worksheet->set_row(0, 20); # 行1の高さを20に設定
高さを変更することなくフォーマットを指定したければheightパラメータとしてundefを渡すことができます:
$worksheet->set_row(0, undef, $format);
ser_row()はセルが出力された後に呼び出されたときにだけ、$formatパラメータは書式を定義します:
$worksheet->write('A1', "Hello"); # 書式設定される
$worksheet->set_row(0, undef, $format);
$worksheet->write('B1', "Hello"); # 書式設定されない
この動きは将来のリリースで修正される予定です。
このメソッドは列またはある範囲にある列の幅を指定するために使うことができます。もしこのメソッドを1つの列に対して適用するときには$first_colと$last_colは同じでなければなりません。列のためのA1記法をの形式を使って列の範囲を指定することもできます。セル記法.についての注意をご覧ください。
例:
$worksheet->set_column(0, 0, 20); # 列 A の幅を20に設定
$worksheet->set_column(1, 3, 30); # 列 B-D の範囲の幅を30に設定
$worksheet->set_column('E:E', 20); # 列 E の幅を20に設定
$worksheet->set_column('F:H', 30); # 列 F-H の範囲の幅を30に設定
幅はExcelで決められた列幅に対応します。これはおおよそArial 10のデフォルト・フォントでの文字列の長さと同じです。残念ながら、Excelファイル・フォーマットで列に"自動調整"を指定することは出来ません。この機能はExcelから実行時にだけ利用することが出来ます。
$formatパラメータはオプションです。さらなる情報はセルの書式設定をご覧ください。幅を変更することなく書式を設定したければ、widthパラメータにundefを渡すことができます:
$worksheet->set_column(0, 0, undef, $format);
$formatパラメータはSpreadsheet::WriteExcelによって出力される個々のセルに書式を設定しません。それはワークブックがExcelで開かれた後に書かれたセルにだけ影響があります。この動きは将来のリリースで修正される予定です。
$hiddenパラメータはオプションです。列を隠したければ、それを1に設定してください。それは例えば、複雑な計算での中間段階を隠すために使うことが出来ます:
$worksheet->set_column('D:D', 20, $format, 1);
$worksheet->set_column('E:E', undef, undef, 1);
このメソッドはワークシートを、ウィンドウ枠(pane)として知られている垂直方向あるいは水平方向の領域に分割するために使うことが出来ます。さらにこれらの枠を分割する棒を見えないようにするため、"固定"とします。これはExcelでの"ウィンドウ-ウィンドウ枠の固定"と同じです。
$rowと$colのパラメータは、分割位置を指定するために使われます。分割はセルの上または左で指定され、メソッドは0始まりのインデックスを利用するということは注意するべきでしょう。そのためワークシートの先頭行を固定したければ、行2で分割するように指定する必要があります(これは0始まりのインデックスでは1です)。これは1始まりのインデックスを使っているように思わせるかもしれませんが、これはそうではありません。
垂直あるいは水平分割をしたくなければ、$rowや$colパラメータに0を設定することが出来ます。
例:
$worksheet->freeze_panes(1, 0); # 先頭行を固定
$worksheet->freeze_panes('A2'); # 同じ事をA1記法を使って
$worksheet->freeze_panes(0, 1); # 最初のカラムを固定
$worksheet->freeze_panes('B1'); # 同じ事をA1記法を使って
$worksheet->freeze_panes(1, 2); # 最初の行と前2番目のまでのカラムを固定
$worksheet->freeze_panes('C2'); # 同じ事をA1記法を使って
$top_rowと$left_colはオプションです。これらはウィンドウ枠のスクロールする領域で一番上と一番左の見える行または列を指定するために使われます。例えば先頭行を固定とし、スクロール領域を行20から開始するには以下のようにします:
$worksheet->freeze_panes(1, 0, 20, 0);
$top_rowと$left_colパラメータにはA1記法を使用することは出来ません。
ディストリビューションのexamplesディレクトリにあるpanes.plもご覧ください。
このメソッドはワークシートを、ウィンドウ枠(pane)として知られている垂直方向あるいは水平方向の領域に分割するために使うことが出来ます。これはfreeze_panes()メソッドはウィンドウ枠の分割がユーザに見え、各ウィンドウ枠が独自のスクロールバーを持つことです。
パラメータ$yと$xは分割の垂直と水平位置を指定します。$yと$xの単位はExcelによって行の高さと劣の幅を指定するために使われているものと同じです。しかし垂直と水平の単位はお互いに違っています。このため$yと$xパラメータを、あなたが設定したあるいはデフォルトの値(行は12.75、列は8.43)である、行の高さと列の幅の見地から指定しなければなりません。
垂直あるいは水平の分割をしたくなければ、$yと$xのどちらかの1つのパラメータを0に指定することがでいます。パラメータ$top_rowと$left_colはオプションです。それらは左下のウィンドウ枠の一番上あるいは一番左の見える行または列をしています。
例:
$worksheet->thaw_panes(12.75, 0, 1, 0); # 先頭行
$worksheet->thaw_panes(0, 8.43, 0, 1); # 先頭列
$worksheet->thaw_panes(12.75, 8.43, 1, 1); # 先頭行と先頭列
このメソッドではA1記法を使うことが出来ません。
freeze_panes()メソッドとディストリビューションのexamplesディレクトリにあるpanes.plプログラムもご覧ください。
一般的にはセルの結合はFormatオブジェクトのmergeプロパティを設定することにより実現します。セルの書式設定をご覧ください。しかし、ある状況では、これでは十分ではなく、追加でmerge_cells()メソッドを通してそれらのセルが結合されていることを指定する必要があります。
merge_cells()メソッドが必要になるケースは以下の通り:
1. セルを垂直に結合する
2. ハイパーリングが入っているセルをマージする
このメソッドの使い方の例については、ディストリビューションのexamplesディレクトリにあるmerge3.plプログラムをご覧ください。
このメソッドは現在のところ利用が限定されます。これはSpreadsheet::WriteExcelがExcel97/2000ファイル・フォーマットに移行するとより重要な役割を演じます。
一般にset_merge()メソッドだけが、結合されたセルを作成するために必要です、セルの書式設定をご覧ください。
ページ設定メソッドは印刷されたときのワークシートの見え方に影響を与えます。これらはページ・ヘッダやフッタ、マージンのような機能を逝去します。これらのメソッドは本当に単なる標準のワークシートメソッドです。ドキュメントをここで別のセクションに分けているのは、明確にするためです。
Excelのページ設定オプションのすべてがこのリリースで利用できるわけではありませんが、それらは個の後のリリースで追加されます。
Spreadsheet::WriteExcelを利用するとき、よくある要望は、同じページ設定機能をワークブックのなかの、すべてのワークシートに適用することです。これをするにはworkbookのなかのworksheetsの配列にアクセスするためworkbookクラスのworksheets()メソッドを使うことが出来ます:
foreach $worksheet (@{$workbook->worksheets()}) {
$worksheet->set_landscape();
}
このメソッドはワークシートの印刷されるページを横に設定します:
$worksheet->set_landscape(); # Landscape mode
ワークシートの印刷されるページを縦にします。デフォルトのワークシートの方向は縦です。そのため一般にはこのメソッドを呼び出す必要は無いでしょう。
$worksheet->set_portrait(); # Portrait mode
このメソッドを使ってワークシートの印刷出力のための用紙フォーマットを設定します。以下の用紙スタイルが利用できます:
Index 用紙フォーマット 用紙サイズ
===== ============ ==========
0 Printer default -
1 Letter 8 1/2 x 11 in
2 Letter Small 8 1/2 x 11 in
3 Tabloid 11 x 17 in
4 Ledger 17 x 11 in
5 Legal 8 1/2 x 14 in
6 Statement 5 1/2 x 8 1/2 in
7 Executive 7 1/4 x 10 1/2 in
8 A3 297 x 420 mm
9 A4 210 x 297 mm
10 A4 Small 210 x 297 mm
11 A5 148 x 210 mm
12 B4 250 x 354 mm
13 B5 182 x 257 mm
14 Folio 8 1/2 x 13 in
15 Quarto 215 x 275 mm
16 - 10x14 in
17 - 11x17 in
18 Note 8 1/2 x 11 in
19 Envelope 9 3 7/8 x 8 7/8
20 Envelope 10 4 1/8 x 9 1/2
21 Envelope 11 4 1/2 x 10 3/8
22 Envelope 12 4 3/4 x 11
23 Envelope 14 5 x 11 1/2
24 C size sheet -
25 D size sheet -
26 E size sheet -
27 Envelope DL 110 x 220 mm
28 Envelope C3 324 x 458 mm
29 Envelope C4 229 x 324 mm
30 Envelope C5 162 x 229 mm
31 Envelope C6 114 x 162 mm
32 Envelope C65 114 x 229 mm
33 Envelope B4 250 x 353 mm
34 Envelope B5 176 x 250 mm
35 Envelope B6 176 x 125 mm
36 Envelope 110 x 230 mm
37 Monarch 3.875 x 7.5 in
38 Envelope 3 5/8 x 6 1/2 in
39 Fanfold 14 7/8 x 11 in
40 German Std Fanfold 8 1/2 x 12 in
41 German Legal Fanfold 8 1/2 x 13 in
注意、ユーザにプリンターがサポートしている用紙フォーマットに依存するのでエンドユーザにはこれらの用紙サイズのすべてが使えるということではありません。このため標準の用紙サイズを入れておくのが一番です。
$worksheet->set_paper(1); # US Letter
$worksheet->set_paper(9); # A4
用紙タイプを指定しなければ、ワークシートにプリンターのデフォルトの用紙を使って印刷されます。
ワークシートを水平方向に印刷されるページでのマージンの間で中央に寄せます。
$worksheet->center_horizontally();
ワークシートを垂直方向に印刷されるページでのマージンの間で中央に寄せます。
$worksheet->center_vertically();
印刷されるページにワークシート・マージンを設定するために利用できるメソッドはいくつかあります:
set_margins() # すべてのマージンを同じ値に設定する
set_margins_LR() # 左と右のマージンを同じ値に設定する
set_margins_TB() # 上と下のマージンを同じ値に設定する
set_margin_left(); # 左マージンを設定する
set_margin_right(); # 右マージンを設定する
set_margin_top(); # 上マージンを設定する
set_margin_bottom(); # 下マージンを設定する
これらすべてのメソッドはインチ単位での距離をパラメータとしてとります。注意:1インチ=25.4mm。;-)デフォルトの左と右のマージンは0.75インチ。デフォルトの上と下のマージンは1.00インチです。
ヘッダとフッタは平文と制御文字の組み合わせである$stringを使って生成されます。$marginパラメータはオプションです。
利用できる制御文字には以下のものがあります:
制御文字 種類 説明
======= ==== ===========
&L 位置 左
&C 中央
&R 右
&P 情報 ページ番号
&N 合計ページ数
&D 日付
&T 時刻
&F ファイル名
&A ワークシート名
&fontsize フォント フォントサイズ
&"font,style" フォント名とスタイル
ヘッダとフッタでのテキストは、テキストの前についた制御文字&L、&Cそして&Rがにより、右、中央、左に整えられ(整列させられ)ます。
例えば(ASCIIアートで結果を表します):
$worksheet->set_header('&LHello');
---------------------------------------------------------------
| |
| Hello |
| |
$worksheet->set_header('&CHello');
---------------------------------------------------------------
| |
| Hello |
| |
$worksheet->set_header('&RHello');
---------------------------------------------------------------
| |
| Hello |
| |
位置付けを指定しなければ、テキストを中央寄せされます:
$worksheet->set_header('Hello');
---------------------------------------------------------------
| |
| Hello |
| |
それぞれに位置付け領域をもったテキストも指定することが出来ます:
$worksheet->set_header('&LCiao&CBello&RCielo');
---------------------------------------------------------------
| |
| Ciao Bello Cielo |
| |
情報制御文字はExcelがワークブックまたはワークシートを変更したときに更新する変数のように動きます。時刻と日付はユーザのデフォルト・フォーマットで表されます:
$worksheet->set_header('Page &P of &N');
---------------------------------------------------------------
| |
| Page 1 of 6 |
| |
$worksheet->set_header('Updated at &T');
---------------------------------------------------------------
| |
| Updated at 12:30 PM |
| |
テキストの部分のフォントサイズを&n制御文字を頭につけることにより指定することが出来ます。nはフォント・サイズです:
$worksheet->set_header('&30Hello Big' );
$worksheet->set_header('&10Hello Small');
テキストの部分のフォントサイズを&"font,style"制御並びを頭につけることにより指定することが出来ます。fontnameは”Courier New"や"Times New Roman"のようなフォント名、そしてstyleは標準のWindowsフォント記述子の1つです:"Regular", "Italic", "Bold" または "Bold Italic":
$worksheet1->set_header('&"Courier New,Italic"Hello');
$worksheet2->set_header('&"Courier New,Bold Italic"Hello');
$worksheet3->set_header('&"Times New Roman,Regular"Hello');
複雑なヘッダやフッタを作成するために、これらすべての機能を一緒に組み合わせることは可能です。複雑なヘッダやフッタを設定するための助けとして、Excelでページ設定をマクロで記録し、VBAが生成したフォーマット文字列を見ることが出来ます。しかしVBAは1つのダブルクォートを示すために2つのダブルクォート""を使うことを忘れないでください。上記の最後の例に同じVBAコードはこのようになります:
.LeftHeader = ""
.CenterHeader = "&""Times New Roman,Regular""Hello"
.RightHeader = ""
ヘッダあるいはフッタ文字列は255文字より小さくなければなりません。
前で書いたとおり、marginパラメータはオプションです。他のマージンと同じように、その値はインチ単位です。デフォルトのヘッダとフッタのマージンは0.50インチです。ヘッダとフッタ・マージンサイズは以下のように設定することが出来ます:
$worksheet->set_header('&CHello', 0.75);
ヘッダとフッタのマージンは上または下のマージンとは別であることに注意してください。
set_footer()メソッドの利用法は上記で説明したset_header()メソッドと同じです。
各ページの先頭で繰り返す行の番号を設定します。(訳者注:列見出しのこと)
大きなExcelドキュメントには、しばしばワークシートの先頭行や行範囲を各ページの先頭で出力するようにしたいと望まれます。これはrepeat_rows()メソッドを使うことにより、実現できます。パラメータ$first_rowと$last_rowは0始まりです。1行だけしか指定したくないならば、$last_rowパラメータはオプションです:
$worksheet1->repeat_rows(0); # 先頭行の繰り返し
$worksheet2->repeat_rows(0, 1); # 先頭2行の繰り返し
各ページの左側に繰り返す列を設定します。(訳者注:行見出しのこと)
大きなExcelドキュメントには、しばしばワークシートの先頭列や列範囲を各ページの左側に出力するようにしたいと望まれます。これはrepeat_columns()メソッドを使うことにより、実現できます。パラメータ$first_columnと$last_columnは0始まりです。1列だけしか指定したくないならば、$last_columnパラメータはオプションです。A1列記法を使って列を指定することも出来ます、セル記法.についての注意をご覧ください:
$worksheet1->repeat_columns(0); # 先頭列の繰り返し
$worksheet2->repeat_columns(0, 1); # 先頭2列の繰り返し
$worksheet3->repeat_columns('A:A'); # 先頭列の繰り返し
$worksheet4->repeat_columns('A:B'); # 先頭2列の繰り返し
このメソッドは印刷されるページでの枠線を隠すために使われます。
枠線はワークシートでセルを区切る線です。印刷される枠線はデフォルトで有効になっています。もし独自のセル罫線を持っているならば、印刷されるページで枠線を隠したいかもしれません。
$worksheet->hide_gridlines();
印刷されるページで行と列のヘッダを印刷するオプションを設定します。(訳者注:行列番号のこと)
Excelワークシートは以下のような感じになります:
------------------------------------------
| | A | B | C | D | ...
------------------------------------------
| 1 | | | | | ...
| 2 | | | | | ...
| 3 | | | | | ...
| 4 | | | | | ...
|...| ... | ... | ... | ... | ...
ヘッダは、ワークシートの上と左にある文字と番号です。これらのヘッダは主に、ワークシート上の位置を示すために提供されるので、印刷されるページでは一般には現れません。もしそれらを印刷したければ、print_row_col_headers()メソッドを使うことが出来ます:
$worksheet1->print_row_col_headers()
上記のset_header()セクションで説明したページ・ヘッダとこれらのヘッダを混乱しないでください。
ワークシートの印刷される領域を指定するために使われます。すべてのパラメータを指定しなければなりません。A1記法も使うことが出来ます、セル記法.についての注意をご覧ください:
$worksheet1->print_area("A1:H20"); # A1からH20のセル範囲
$worksheet2->print_area(0, 0, 19, 7); # 同じ
fit_to_pages()メソッドは縦と横の両方向に、印刷エリアを指定されたページ数へあわせるために使われます。もし印刷領域が指定されれた数を超えると、あうように縮小します。ページ・サイズやマージンが変更されても、これは印刷領域がつねに指定されたページ数に表示されることを保証します。
$worksheet1->fit_to_pages(1, 1); # 1x1 ページにあわせる
$worksheet2->fit_to_pages(2, 1); # 2x1 ページにあわせる
$worksheet3->fit_to_pages(1, 2); # 1x2 ページにあわせる
この印刷領域は上記で説明したprint_area()メソッドで定義することが出来ます。
fit_to_pages()を引数なしあるいは1つの引数で呼び出すと、$widthと$heightのデフォルト値は1ページです。しかしデフォルトではページにあわせるオプションは有効ではありません。
fit_to_pages()はワークシートで定義された手でいれられた改ページを上書きすることに注意してください。
ワークシートに水平方向の改ページを追加します。改ページはその後ろにあるすべてのデータを次のページに印刷させます。水平方向の改ページは行の間で起こります。行20と21の間で改ページしたければ、改ページを行21に指定しなければなりません。しかし0始まりのインデックスの書き方では、これは実際には行20になります。そこで少しの間、1始まりのインデックスの書き方を使っているというふりをすることができます:
$worksheet1->set_h_pagebreaks(20); # 行20と21の間で改ページ
set_h_pagebreaks()メソッドは改ページのリストを受け取り、それを1回以上呼び出すことが出来ます:
$worksheet2->set_h_pagebreaks( 20, 40, 60, 80, 100); # 改ページを追加
$worksheet2->set_h_pagebreaks(120, 140, 160, 180, 200); # さらに追加
注意:fit_to_pages()メソッドを通して"ページにあわせる"オプションを指定すると、手によるすべての改ページを上書きします。
現在の実装はワークシート毎に1000個の改ページに黙って制限します。この制限は将来のリリースでは削除されます。
ワークシートに垂直方向の改ページを追加します。改ページはその後ろにあるすべてのデータを次のページに印刷させます。垂直方向の改ページは行の間で起こります。列20と21の間で改ページしたければ、改ページを列21に指定しなければなりません。しかし0始まりのインデックスの書き方では、これは実際には列20になります。そこで少しの間、1始まりのインデックスの書き方を使っているというふりをすることができます:
$worksheet1->set_v_pagebreaks(20); # 列20と21の間で改ページ
set_v_pagebreaks()メソッドは改ページのリストを受け取り、それを1回以上呼び出すことが出来ます:
$worksheet2->set_v_pagebreaks( 20, 40, 60, 80, 100); # 改ページを追加
$worksheet2->set_v_pagebreaks(120, 140, 160, 180, 200); # さらに追加
注意:fit_to_pages()メソッドを通して"ページにあわせる"オプションを指定すると、手によるすべての改ページを上書きします。
このセクションはExcelでのセル書式設定のために利用できるメソッドとプロパティについて説明します。Spreadsheet::WriteExcelを通して利用できるセル書式設定の例はが入っています:フォント、色、パターン、罫線、配置、数値の書式があります。
セルの書式設定はFormatオブジェクトを通して定義されます。Formatオブジェクトは以下のようにworkbookのaddformat()メソッドを呼び出すことにより作成されます:
my $format1 = $workbook->addformat(); # 後でプロパティを設定
my $format2 = $workbook->addformat(%props); # 作成時にプロパティを設定
Formatオブジェクトはセル、行や列に適用される、すべての書式設定のプロパティを保持します。これらのプロパティを設定する処理は次のセクションで説明します。
一度Formatオブジェクトが作成され、プロパティが設定されると、以下のようにworksheetのwriteメソッドの引数として渡すことが出来ます:
$worksheet->write(0, 0, "One", $format);
$worksheet->write_string(1, 0, "Two", $format);
$worksheet->write_number(2, 0, 3, $format);
$worksheet->write_blank(3, 0, $format);
Formatは、行や列のデフォルトのプロパティを定義するためのworksheetのset_row()とset_column()メソッドにも渡すことが出来ます。
$worksheet->set_row(0, 15, $format);
$worksheet->set_column(0, 0, 15, $format);
しかしset_row()とset_column()メソッドはWritえExcelによって出力されるここのセルのための書式は設定しません。ワークブックがExcelによって開かれた後に書かれたセルにだけ影響があります。
以下の表はExcel書式カテゴリ、書式プロパティそしてそのようにする対応するオブジェクト・メソッドを示します:
カテゴリ プロパティ メソッド名
-------- -------------- -----------
フォント フォント型 set_font()
フォント・サイズ set_size()
フォント色 set_color()
太字 set_bold()
斜体 set_italic()
下線 set_underline()
打消線 set_font_strikeout()
上付き/下付き set_font_script()
アウトライン set_font_outline()
影付き set_font_shadow()
数値 数値フォーマット set_num_format()
位置付け 水平配置 set_align()
垂直配置 set_align()
回転 set_rotation()
テキスト折り返し set_text_wrap()
均等割付 set_text_justlast()
マージ set_merge()
パターン セル・パターン set_pattern()
背景色 set_bg_color()
前景色 set_fg_color()
罫線 セル罫線 set_border()
下罫線 set_bottom()
上罫線 set_top()
左罫線 set_left()
右罫線 set_right()
罫線色 set_border_color()
下色 set_bottom_color()
上色 set_top_color()
左色 set_left_color()
右色 set_right_color()
Formatプロパティを設定するには2つの方法があります:オブジェクト・メソッド・インターフェースを使うか、直接プロパティを設定するかです。例えばメソッドの典型的な使い方は以下のようになります:
my $format = $workbook->addformat();
$format->set_bold();
$format->set_color('red');
これに対して、Formatコンストラクタにプロパティのハッシュを渡すことにより直接、プロパティを設定することが出来ます:
my $format = $workbook->addformat(bold => 1, color => 'red');
あるいは、Formatが作成された後でもset_properties()メソッドを以下のように使う方法によって:
my $format = $workbook->addformat();
$format->set_properties(bold => 1, color => 'red');
1つまたは複数の名前を付けたハッシュにプロパティを格納し、それを必要とするメソッドに渡すことができます:
my %font = (
'font' => 'Arial',
'size' => 12,
'color' => 'blue',
'bold' => 1,
);
my %shading = (
'fg_color' => 'green',
'pattern' => 1,
);
my $format1 = $workbook->addformat(%font); # フォントのみ
my $format2 = $workbook->addformat(%font, %shading); # フォントと網掛け
プロパティ設定に2つの方法を提供することにより、どちらが一番いい方法かを悩ませてしまうかもしれません。その答えは、あなたのプログラムで必要とされる書式設定の量によります。はじめ、Spreadsheet::WriteExcelは個々のFormatプロパティを適切なメソッドを通して設定することだけを可能にしていました。この方法はほとんどのプログラムには十分でしたが、書式設定をたくさん必要とするプログラムではとても扱いにくいことがわかりました。さらにFormatオブジェクト間でプロパティを再利用するための仕組みは困難です。
その結果、Perl/Tk形式によるプロパティの追加が、たくさんの書式設定を必要とする開発者を楽にすることを願って加えられました。事実、プロパティ定義でのTk形式もサポートされています:
my %font = (
-font => 'Arial',
-size => 12,
-color => 'blue',
-bold => 1,
);
プロパティのハッシュを利用するついかの利点は、workbookオブジェクト間で書式を共有することも可能にすることです。
以下のように"その場で"Formatを作成し、直接writeメソッドにそれを渡すこともできます:
$worksheet->write('A1', "Title", $workbook->addformat(bold => 1));
Perlでいう無名のデータやサブルーチンを同じように"無名の"フォーマットに対応します。
大量の書式設定でExcelファイルを作成する必要があるンラバ、ディストリビューションのexampleディレクリにあるlecxe.plプログラムも使うことが出来ます。lecxeはTomas Andersson によって作成されたWin32::OLEプログラムで、ExcelファイルをSpreadsheet::WriteExcelファイルに変換します。このため、Excelを使って書式設定を定義し、あなたに代わって大変なことをlecxeにさせることができます。
デフォルトの書式はArial 10で他のプロパティはオフです。
Spreadsheet::WriteExcelでの各ユニークなフォーマットは対応するFormatオブジェクトを持たなければなりません。Formatをwrite()メソッドと一緒に使い、それからFormatを後から使うために再定義するといったことはできません。これはFormatがcellに対して適用されるのではなく、その最終状態が適用されるからです。以下の例について考えてみてください:
my $format = $workbook->addformat();
$format->set_bold();
$format->set_color('red');
$worksheet->write('A1', "Cell A1", $format);
$format->set_color('green');
$worksheet->write('B1', "Cell B1", $format);
セル A1にはFormat $formatが代入されます。その色は始め赤でした。しかし後で緑に設定されました。Excelが表示するときにはセルA1はそのFormatの最終状態を表示します。この場合には色は緑になります。
一般に引数なしでメソッドを呼び出すと、それはプロパティを有効にします、例えば:
my $format1 = $workbook->addformat();
$format1->set_bold(); # 太字を有効にする
$format1->set_bold(1); # 同じく太字を有効にする
$format1->set_bold(0); # 太字を無効にする
Formatオブジェクト・メソッドは以下のセクションでさらに詳しく説明します。さらにWriteExcelディストリビューションのexamplesディレクトリにformats.plというPerlプログラムがあります。このプログラムはformat.xlsというExcelワークブックを作成します。それにはほとんどすべての書式タイプが入っています。
以下のFormatメソッドが利用できます:
set_font()
set_size()
set_color()
set_bold()
set_italic()
set_underline()
set_font_strikeout()
set_font_script()
set_font_outline()
set_font_shadow()
set_num_format()
set_align()
set_align()
set_rotation()
set_text_wrap()
set_text_justlast()
set_merge()
set_pattern()
set_bg_color()
set_fg_color()
set_border()
set_bottom()
set_top()
set_left()
set_right()
set_border_color()
set_bottom_color()
set_top_color()
set_left_color()
set_right_color()
上記のメソッドはプロパティとして直接適用することもできます。例えば$worsheet->set_bold()は、set_properties(bold => 1)と同じです。
既存のFormatオブジェクトのプロパティはset_properties()によって設定することが出来ます:
my $format = $workbook->addformat();
$format->set_properties( bold => 1, color => 'red');
1つまたは複数の名前付ハッシュにプロパティを格納し、それをset_properties()メソッドに渡すことも出来ます:
my %font = (
'font' => 'Arial',
'size' => 12,
'color' => 'blue',
'bold' => 1,
);
my $format = $workbook->set_properties(%font);
このメソッドはaddformat()でプロパティを設定したり、以下のセクションで詳細を説明する特定の書式設定メソッドの代わりとして使うことが出来ます。
デフォルト状態: フォントはArial
デフォルト動作: なし
適切な引数: 適切なフォント名
使用するフォントを指定:
$format->set_font('Times New Roman');
Excelは実行しているシステムにインストールされているフォントだけを表示できます。このため'Arial','Times New Roman'そして'Courier New'のように標準でついてくるフォントを使うのが一番よい方法です。例についてはformats.plによって作成されるFontsワークシートをご覧ください。
デフォルト状態: フォントサイズは10
デフォルト動作: フォントサイズを1に設定
適切な引数: 1から画面の大きさまでの整数値
Excelは行での最も大きいフォントサイズに合わせて行の高さを調整します。sert_row()ワークシート・メソッドを使って行の高さを明示的に指定することもできます。
my $format = $workbook->addformat();
$format->set_size(30);
デフォルト状態: Excelデフォルト色。通常は黒。
デフォルト動作: デフォルト色に設定
適切な引数: 8から63までの整数または以下の文字列:
'aqua'
'black'
'blue'
'fuchsia'
'gray'
'green'
'lime'
'navy'
'orange'
'purple'
'red'
'silver'
'white'
'yellow'
フォント色を設定します。set_color()メソッドは以下のように使われます:
my $format = $workbook->addformat();
$format->set_color('red');
$worksheet->write(0, 0, "wheelbarrow", $format);
注意:set_colorメソッドはセルのフォントの色を設定するために使われます。セルの色を設定するためにはset_fg_color()とset_patterm()メソッドを使ってください。
追加の例はformats.plによって作成される'Named colors'と'Standard colors'ワークシートをご覧ください。
デフォルト状態: 太字がオフ
デフォルト動作: 太字をオンにする
適切な引数: 0, 1 [1]
フォントの太字(bold)プロパティを設定します。
$format->set_bold(); # 太字をオン
[1] 実際には値は100〜1000範囲も適切です。400が通常、700と1000がとても太くなります。おそらくは1を設定し、通常の太字を使うのが一番よいでしょう。
デフォルト状態: 斜体はオフ
デフォルト動作: 斜体をオンにする
適切な引数: 0, 1
フォントの斜体(Italic)プロパティを設定します。
デフォルト状態: 下線はオフ
デフォルト動作: 一本線の下線をオンにする
適切な引数: 0 = 下線なし
1 = 一本線の下線
2 = 二重線の下線
33 = 会計用一本線の下線
34 = 会計用二重線の下線
フォントの下線(underline)プロパティを設定します。
デフォルト状態: 打消線はオフ
デフォルト動作: 打消線をオンにする
適切な引数: 0, 1
フォントの打消線(strikeout)プロパティを設定します。
デフォルト状態: 上付/下付文字はオフ
デフォルト動作: 上付き文字をオン
適切な引数: 0 = 通常
1 = 上付き
2 = 下付き
フォントの上付/下付文字(superscript/subscript)プロパティを設定します。このフォーマットは現在ははあまり有効ではありません。
デフォルト状態: アウトラインはオフ
デフォルト動作: アウトラインをオン
適切な引数: 0, 1
Macintoshのみ。
デフォルト状態: 影付き文字はオフ
デフォルト動作: Turn shadow on
適切な引数: 0, 1
Macintoshのみ。
デフォルト状態: 標準フォーマット
デフォルト動作: Formatインデックス1
適切な引数: 以下の表を参照
このメソッドはExcelでの数値のフォーマットを定義するために使われます。これは数値が、整数、浮動小数点数、日付、通貨の値のいずれか、あるいはユーザが定義した書式として表示されるかを制御します。
セルの数値フォーマットはフォーマット文字列またはExcelの組込フォーマットの1つで指定することができます:
my $format1 = $workbook->addformat();
my $format2 = $workbook->addformat();
$format1->set_num_format('d mmm yyyy'); # 書式文字列
$format2->set_num_format(0x0f); # 書式番号
$worksheet->write(0, 0, 36892.521, $format1); # 1 Jan 2001
$worksheet->write(0, 0, 36892.521, $format2); # 1-Jan-01
フォーマット文字列を使うと、とても洗練された数値の書式設定を定義することができます。
$format01->set_num_format('0.000');
$worksheet->write(0, 0, 3.1415926, $format01); # 3.142
$format02->set_num_format('#,##0');
$worksheet->write(1, 0, 1234.56, $format02); # 1,235
$format03->set_num_format('#,##0.00');
$worksheet->write(2, 0, 1234.56, $format03); # 1,234.56
$format04->set_num_format('$0.00');
$worksheet->write(3, 0, 49.99, $format04); # $49.99
$format05->set_num_format('£0.00');
$worksheet->write(4, 0, 49.99, $format05); # £49.99
$format06->set_num_format('¥0.00');
$worksheet->write(5, 0, 49.99, $format06); # ¥49.99
$format07->set_num_format('mm/dd/yy');
$worksheet->write(6, 0, 36892.521, $format07); # 01/01/01
$format08->set_num_format('mmm d yyyy');
$worksheet->write(7, 0, 36892.521, $format08); # Jan 1 2001
$format09->set_num_format('d mmmm yyyy');
$worksheet->write(8, 0, 36892.521, $format09); # 1 January 2001
$format10->set_num_format('dd/mm/yyyy hh:mm AM/PM');
$worksheet->write(9, 0, 36892.521, $format10); # 01/01/2001 12:30 AM
$format11->set_num_format('0 "dollar and" .00 "cents"');
$worksheet->write(10, 0, 1.87, $format11); # 1 dollar and .87 cents
# 条件付きの書式
$format12->set_num_format('[Green]General;[Red]-General;General');
$worksheet->write(11, 0, 123, $format12); # > 0 Green
$worksheet->write(12, 0, -45, $format12); # < 0 Red
$worksheet->write(13, 0, 0, $format12); # = 0 Default colour
システムが日付のために使っている番号についてはExcelでの日付で説明しています。
色の書式は以下のいずれかの値でなければなりません:
[Black] [Blue] [Cyan] [Green] [Magenta] [Red] [White] [Yellow]
代わりに以下のようにカラー・インデックスをベースとして色を指定することができます:[Color n]、nは標準のExcelカラー・インデックス -7です。formats.plによって作成される'Standard colors'ワークシートをご覧ください。
詳細な情報はSpreadsheet::WriteExcelディストリビューションのdocディレクトリにある書式設定(formatting)についてのドキュメント、Excelオンラインヘルプ、またはhttp://support.microsoft.com/support/Excel/Content/Formats/default.asp、http://support.microsoft.com/support/Excel/Content/Formats/codes.aspをご覧ください。
WriteExcelで使う前にExcelでその書式文字列が正しいかどうかを確認するべきです。
Excelの組み込みフォーマットを以下の表で示します::(訳者注:以下の書式は英語版が元になっており、日本版では日付や通貨記号など異なるものもあります。)
インデックス 書式文字列
0 0x00 標準
1 0x01 0
2 0x02 0.00
3 0x03 #,##0
4 0x04 #,##0.00
5 0x05 ($#,##0_);($#,##0)
6 0x06 ($#,##0_);[Red]($#,##0)
7 0x07 ($#,##0.00_);($#,##0.00)
8 0x08 ($#,##0.00_);[Red]($#,##0.00)
9 0x09 0%
10 0x0a 0.00%
11 0x0b 0.00E+00
12 0x0c # ?/?
13 0x0d # ??/??
14 0x0e m/d/yy
15 0x0f d-mmm-yy
16 0x10 d-mmm
17 0x11 mmm-yy
18 0x12 h:mm AM/PM
19 0x13 h:mm:ss AM/PM
20 0x14 h:mm
21 0x15 h:mm:ss
22 0x16 m/d/yy h:mm
.. .... ...........
37 0x25 (#,##0_);(#,##0)
38 0x26 (#,##0_);[Red](#,##0)
39 0x27 (#,##0.00_);(#,##0.00)
40 0x28 (#,##0.00_);[Red](#,##0.00)
41 0x29 _(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)
42 0x2a _($* #,##0_);_($* (#,##0);_($* "-"_);_(@_)
43 0x2b _(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)
44 0x2c _($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_)
45 0x2d mm:ss
46 0x2e [h]:mm:ss
47 0x2f mm:ss.0
48 0x30 ##0.0E+0
49 0x31 @
これらの書式コードの例については、formats.plにより作成される'Numerical formats'ワークシートをご覧ください。
注1.数値フォーマットの23から36はマイクロソフトによりドキュメントにされていません。そして国際的なバージョンでは違うかもしれません。
注2.Excel5ではドル記号はドル記号として表示されます。Excel97-2000はそれを定義されているローカルの通貨記号として表します。
注3.赤い負の値の書式は、Excel5とExcel97-2000とではちょっと違います。
デフォルト状態: 位置付けはオフ
デフォルト動作: 左に位置づけ
適切な引数: 'left' 水平方向
'center'
'right'
'fill'
'justify'
'merge'
'top' 垂直方向
'vcenter'
'bottom'
'vjustify'
このメソッドはセル内での水平方向、垂直方向のテキスト位置付けを設定するために使われます。垂直方向と水平方向の位置付けは組み合わせることができます。このメソッドは以下のように使われます:
my $format = $workbook->addformat();
$format->set_align('center');
$format->set_align('vcenter');
$worksheet->set_row(0, 30);
$worksheet->write(0, 0, "X", $format);
テキストは、mergeプロパティを使って2つまたはそれ以上の隣接したセルにまたがって位置付けすることができます。set_merge()メソッドをご覧ください。
vjustify(垂直方向の均等割付)オプションはセルないでの自動的なテキストの折り返しを提供します。セルの高さは折り返されたテキストにあうように調整されます。テキストの折り返しが使われる場所を指定するためにはset_text_wrap()メソッドを使ってください。
さらなる例はformats.plによって作成される'Alignment'ワークシートをご覧ください。
デフォルト状態: セルのマージはオフ
デフォルト動作: セルのマージをオン
適切な引数: 1
テキストは、set_mergeメソッドを使って2つまたはそれ以上の隣接したセルにまたがって位置付けすることができます。これはちょっとわかりにくいset_align('merge')メソッドの別名です。
1つのセルだけにテキストを入れ、他のセルはブランクでなければなりません:
my $format = $workbook->addformat();
$format->set_merge();
$worksheet->write(1, 1, 'Merged cells', $format);
$worksheet->write_blank(1, 2, $format);
examplesディレクトリにあるmerge1.plとmerge2.pl、merge3.plプログラムもご覧ください。
デフォルト状態: テキスト折り返しはオフ
デフォルト動作: テキスト折り返しをオンにする
適切な引数: 0, 1
これはテキスト折り返しプロパティを使う例です。エスケープ文字\nが行の終わりを示すために使われています:
my $format = $workbook->addformat();
$format->set_text_wrap();
$worksheet->write(0, 0, "It's\na bum\nwrap", $format);
Excelは折り返されたテキストに合わせて行の高さを調整します。set_align('vjustify')メソッドを使った新しい行無しに同じ効果を得ることができます。examplesデイレクトリにあるtextwrap.plプログラムをご覧ください。
デフォルト状態: テキストの回転はオフ
デフォルト動作: 回転形式を1
適切な引数: 0 回転なし
1 文字を反対にする
2 反時計回りに90°
3 時計回りに90°
formats.plによって作成される'Alignment'ワークシートをご覧ください
デフォルト状態: 均等割付はオフ
デフォルト動作: 均等割付をオン
適切な引数: 0, 1
極東版Excelにのみ適用されます。
デフォルト状態: パターンはオフ
デフォルト動作: 塗りつぶし(Solid fill)がオン
適切な引数: 0 .. 31
利用できるパターンの例はformats.plのよって作成される'Patterns'ワークシートに載っています。しかし前景色で塗りつぶすパターン1以外を必要とすることはあまりないでしょう。
同様: set_bg_color
デフォルト状態: 色はオフ
デフォルト動作: 未定義
適切な引数: set_color()を参照
注意、前景色(foreground colours)と背景色(background colours)は、セルパターンが設定されている場合にのみ効力があります。もっとも一般的には、以下のように塗りつぶし(solid fill)パターンを指定し、前景色をしています:
my $format = $workbook->addformat();
$format->set_pattern(); # パターンを1に設定します。 つまり塗りつぶし(solid fill)
$format->set_fg_color('green'); # 背景色ではなく前景色であることに注意してください。
$worksheet->write(0, 0, "Ray", $format);
同様: set_bottom()
set_top()
set_left()
set_right()
デフォルト状態: 罫線はなし
デフォルト動作: 罫線タイプを1に設定
適切な引数: 0 罫線無し
1 細線
2 中線
3 破線
4 点線
5 太線
6 二重線
7 極細線
セルの罫線は下、上、左、右があります。これらにはset_border()を使って同じ値を設定したり、上記にあげた対応するメソッドを個別に使って設定することができます。利用できる罫線の形式はformats.plによって作成される'Borders'ワークシートで示されます。
同様: set_bottom_color()
set_top_color()
set_left_color()
set_right_color()
デフォルト状態: Colorはオフ
デフォルト動作: 未定義
適切な引数: set_color()を参照
セルの罫線の色を設定する
このメソッドは1つFormatオブジェクトからすべてのプロパティを他のオブジェクトにコピーするために使われます:
my $lorry1 = $workbook->addformat();
$lorry1->set_bold();
$lorry1->set_italic();
$lorry1->set_color('red'); # lorry1は太字、斜体そして赤
my $lorry2 = $workbook->addformat();
$lorry2->copy($lorry1);
$lorry2->set_color('yellow'); # lorry2は太字、斜体そして黄色
これはFormatプロパティへのメソッド・インターフェースを使っているときにだけ便利です。ハッシュを使って直接Formatプロパティを設定するのであれば、一般に必要ではありません。
注意:これはcopyコンストラクタではないことに注意してください。どちらのオブジェクトもコピーする前に存在しなければなりません。
Excelは日付を実数値として格納します。その整数部分は開始日からの日数、そして小数部分には1日での割合が格納されます。そこで必要とされるフォーマットで日付を表示するために、数値フォーマットがセルに適用されます。Spreadsheet::WriteExcelでは、一連の流れは以下のようになります:
$format->set_num_format('mmm d yyyy hh:mm AM/PM');
$worksheet->write('A1', 36892.521, $format); # Jan 1 2001 12:30 AM
開始日は1900年または1904年です。Windows版Excelは1900年を使い、Macintosh版は1904年を使います。しかし、どちらのプラットホームでもExcelはあるシステムから別のものへと自動的に変換します。デフォルトでは、Spreadsheet::WriteExcelは1900年フォーマットを使います。
開始日は:
1900: 1900年 1月 0日 つまり1899年12月31日
1904: 1904年 1月 1日
1900年日付フォーマットには注意すべきおかしなことが2つあります。最初は開始日が1900年1月0日ということです。2番目は1900年が間違ってしかし故意にうるう年として扱われていることです!!このため1900年2月28日以降には1日余分に追加しなければなりません。この変則的なことの理由は http://support.microsoft.com/support/kb/articles/Q181/3/70.asp にあります。
WriteExcelディストリビューションのexamplesディレクトリに、Excelの日付を計算する関数が入った2つの例のプログラムがあります:
excel_date1.plはAndrew Benhamにより作成されました。それにはExcelでの日付計算に含まれている問題について細かい説明があります。これは何も外部モジュールを必要としません。
exce_date2.lは日付計算にDate::Calcモジュールを使っています。
これらの関数といくつかの他の関数は後のリリーヅでユーティリティ・モジュールに入ります。
もし日付を違う書式で扱いたいと計画しているのであれば、Date::CalcとDate::Manipモジュールにより提供される関数をご覧になる価値があるかもしれません。
関数を定義することにより、Excelに日付を計算させることも可能です:
$worksheet->write('A1', '=DATEVALUE("1-Jan-2001")');
しかし、これは式を解析するためにSpreadsheet::WriteExcelでのパフォーマンス・オーバーヘッドを抱えており、たくさんの日付を扱うプログラムでは使うべきではありません。
まず最初に式と関数の実装にいくつかの大きな問題がまだあることに注意しなければなりません。
* 式を書くのは同じことを文字列で書くよりもかなり遅くなります
* 単項演算子 マイナス はサポートされていいません
* 現在のワークシートの外側のセルを参照することはできません
* 配列定数、つまり {1;2;3} を関数で使うことができません
* 文字列で埋め込まれたダブルクォートを使うことはできません
* 演算子の回りの空白は保存されません
とはいえこれらの制約は将来のバージョンではなくなります。これらがあるのは機能と時間とのトレードオフのためです。
ExcelとSpreadsheet::WriteExcelでの式と関数への短い紹介を以下に示します。
式は等号で始まる文字列です:
'=A1+B1'
'=AVERAGE(1, 2, 3)'
式には数値、文字列、ブール値、セル参照、セル範囲そして関数が入ります。式はExcelで出てくるように書かれなければなりません。つまりセルと関数は大文字でなければなりません。
ExcelではセルはA1記法システムを使って参照されます。それでは列は文字、行は数字によって表されます。列の範囲はAからIV つまり0から255、行の範囲は1から16384です。このシステムはSpreadsheet::WriteExcel write()メソッドでは行と列の書き方が0から始まる点で異なります。例えばセルC7は(6,2)として参照されます。ディストリビューションのexamplesディレクトリには、2つのシステムの間で変換するのを助ける関数が入っているconvertA1.plというプログラムがあります。例えば:
cell_to_rowcol('B7'); # (6, 1)を返す
rowcol_to_cell(6, 1), # "B7"を返す
これらの関数といくつかの関数は後のリリースでユーティリティ・モジュールに入ります。
セル参照でのExcel $ 記法もサポートされています。これは行または列が相対であるか、絶対であるかを示すことを可能にします。これはセルがコピーされたときにだけ有効です。以下の例は相対と絶対の値の例を示します。
'=A1' # 列と行が相対
'=$A1' # 列が絶対、行は相対
'=A$1' # 列が相対、行は絶対
'=$A$1' # 列と行が絶対
式は現在のワークブックの他のワークシートのセルも参照することが出来ます。例えば:
'=Sheet2!A1'
'=Sheet2!A1:A5'
'=Sheet2:Sheet3!A1'
'=Sheet2:Sheet3!A1:A5'
q{='Test Data'!A1}
q{='Test Data1:Test Data2'!A1}
シート参照とセル参照はエクスクラメーション・マーク !によって分けられます。もしワークシート名に空白があれば、上記の最後2つの例のように、Excelはそれをシングル・クォートで囲むことを要求します。この場合、クォートを守るために、クォート演算子を使う必要があります。メインのPerlドキュメンテーションでのperlopをご覧ください。addworksheet()メソッドを使って追加された、正しいシート名だけが式の中で使うことが出来ます。外部ワークブックを参照することは出来ません。
下の表はExcel関数で利用できる演算子を一覧にしています。ほとんどの演算子はPerlのものと同じです。違いは示されています。
算術演算子
=====================
演算子 意味 例
+ 加算 1+2
- 減算 2-1
* 乗算 2*3
/ 除算 1/4
^ べき乗 2^3 # ** と同じ
- 単項マイナス -(1+2) # 未サポート
% パーセント(剰余ではない) 13% # サポートされていません 注意[1]
比較演算子
=====================
演算子 意味 例
= 左辺と右辺が等しい A1 = B1 # == と同じ
<> 左辺と右辺が等しくない A1 <> B1 # != と同じ
> 左辺が右辺よりも大きい A1 > B1
< 左辺が右辺よりも小さい A1 < B1
>= 左辺が右辺以上である A1 > =B1
<= 左辺が右辺以下である A1 <= B1
文字列演算子
================
演算子 意味 例
& 連結 "Hello " & "World!" # 注 [2]
参照演算子
====================
演算子 意味 例
: 範囲 演算子 A1:A4 # 注 [3]
, 結合 演算子 SUM(1, 2+2, B3) # 注 [4]
Note
[1]: フォーマットでパーセントを得ること、そしてMOD()で剰余をとることができます。
[2]: Perlでの ("Hello " . "World!") と同じ
[3]: この範囲はセルA1, A2, A3 そして A4と同じ
[4]: カンマはPerlでのリスト・セパレータのように機能します。
範囲とカンマ演算子はExcelの英語以外のバージョンでは異なるシンボルをもっているかもしれません。これらはSpreadsheet::WriteExcelのこの後のバージョンでサポートされます。
以下の表はExcel5とSpreadsheet::WriteExcelでサポートされているコア関数の一覧です。"Analysis ToolPak"やそのほかのアドインによって利用できるようになる追加の関数は何もサポートされません。これらすべての関数は正しく機能することを確認するためテストされています。
ABS DB INDIRECT NORMINV SLN
ACOS DCOUNT INFO NORMSDIST SLOPE
ACOSH DCOUNTA INT NORMSINV SMALL
ADDRESS DDB INTERCEPT NOT SQRT
AND DEGREES IPMT NOW STANDARDIZE
AREAS DEVSQ IRR NPER STDEV
ASIN DGET ISBLANK NPV STDEVP
ASINH DMAX ISERR ODD STEYX
ATAN DMIN ISERROR OFFSET SUBSTITUTE
ATAN2 DOLLAR ISLOGICAL OR SUBTOTAL
ATANH DPRODUCT ISNA PEARSON SUM
AVEDEV DSTDEV ISNONTEXT PERCENTILE SUMIF
AVERAGE DSTDEVP ISNUMBER PERCENTRANK SUMPRODUCT
BETADIST DSUM ISREF PERMUT SUMSQ
BETAINV DVAR ISTEXT PI SUMX2MY2
BINOMDIST DVARP KURT PMT SUMX2PY2
CALL ERROR.TYPE LARGE POISSON SUMXMY2
CEILING EVEN LEFT POWER SYD
CELL EXACT LEN PPMT T
CHAR EXP LINEST PROB TAN
CHIDIST EXPONDIST LN PRODUCT TANH
CHIINV FACT LOG PROPER TDIST
CHITEST FALSE LOG10 PV TEXT
CHOOSE FDIST LOGEST QUARTILE TIME
CLEAN FIND LOGINV RADIANS TIMEVALUE
CODE FINV LOGNORMDIST RAND TINV
COLUMN FISHER LOOKUP RANK TODAY
COLUMNS FISHERINV LOWER RATE TRANSPOSE
COMBIN FIXED MATCH REGISTER.ID TREND
CONCATENATE FLOOR MAX REPLACE TRIM
CONFIDENCE FORECAST MDETERM REPT TRIMMEAN
CORREL FREQUENCY MEDIAN RIGHT TRUE
COS FTEST MID ROMAN TRUNC
COSH FV MIN ROUND TTEST
COUNT GAMMADIST MINUTE ROUNDDOWN TYPE
COUNTA GAMMAINV MINVERSE ROUNDUP UPPER
COUNTBLANK GAMMALN MIRR ROW VALUE
COUNTIF GEOMEAN MMULT ROWS VAR
COVAR GROWTH MOD RSQ VARP
CRITBINOM HARMEAN MODE SEARCH VDB
DATE HLOOKUP MONTH SECOND VLOOKUP
DATEVALUE HOUR N SIGN WEEKDAY
DAVERAGE HYPGEOMDIST NA SIN WEIBULL
DAY IF NEGBINOMDIST SINH YEAR
DAYS360 INDEX NORMDIST SKEW ZTEST
以下の言語で関数名をサポートするモジュールを変更することもできます:German, French, Spanish, Portuguese, Dutch, Finnish, Italian そして Swedish。ディストリビューションのexamplesディレクトリのfunction_locale.plをご覧ください。
Excelの式への一般的な紹介や関数の説明はExcelのヘルプや以下のリンクをご覧ください: http://msdn.microsoft.com/library/default.asp?URL=/library/officedev/office97/s88f2.htm and http://msdn.microsoft.com/library/default.asp?URL=/library/officedev/office97/s992f.htm
もしあなたの式がSpreadsheet::WriteExcelでうまく機能しないのであれば、以下のことを試してみてください:
1. 式がExcelで(あるいはGnumeric や OpenOfficeで)機能するかを確かめてください。
2. このセクションの始めにあるTODOリストにないか確認してください
3. セル参照やセル名が大文字になっているか確認してください
4. U.Sスタイルの範囲、結合演算子を使っているかを確認してください
5. 関数が上記の表にあるか確認してください。
もし1-5のすべてのステップをやっても、まだ問題があれば私にメールしください。
以下の例はSpreadsheet::WriteExcelの基本機能のいくつかを示します。
#!/usr/bin/perl -w
use strict;
use Spreadsheet::WriteExcel;
# simple.xlsという新しいワークブックを作成し、ワークシートを追加します
my $workbook = Spreadsheet::WriteExcel->new("simple.xls");
my $worksheet = $workbook->addworksheet();
# 標準の書き方は sub(行, 列, トークン). row と columnは
# 0始まりであることに注意
# テキストを出力
$worksheet->write(0, 0, "Hi Excel!");
# いくつかの数値を出力
$worksheet->write(2, 0, 3); # 3を出力
$worksheet->write(3, 0, 3.00000); # 3を出力
$worksheet->write(4, 0, 3.00001); # 3.00001を出力
$worksheet->write(5, 0, 3.14159); # TeX リビジョン番号だっけ?
# いくつかの式を出力
$worksheet->write(7, 0, '=A3 + A6');
$worksheet->write(8, 0, '=IF(A5>3,"Yes", "No")');
# ハイパーリンクを出力
$worksheet->write(10, 0, 'http://www.perl.com/');
複数のワークシートを利用するいくつかの機能を実際にやってみせる一般的な例を以下に示します。
#!/usr/bin/perl -w
use strict;
use Spreadsheet::WriteExcel;
# 新しいExcelワークブックを作成
my $workbook = Spreadsheet::WriteExcel->new("regions.xls");
# いくつかのワークシートを追加
my $north = $workbook->addworksheet("North");
my $south = $workbook->addworksheet("South");
my $east = $workbook->addworksheet("East");
my $west = $workbook->addworksheet("West");
# 書式の追加
my $format = $workbook->addformat();
$format->set_bold();
$format->set_color('blue');
# 各ワークシートに見出しを追加
foreach my $worksheet (@{$workbook->worksheets()}) {
$worksheet->write(0, 0, "Sales", $format);
}
# データをいくつか出力
$north->write(0, 1, 200000);
$south->write(0, 1, 100000);
$east->write (0, 1, 150000);
$west->write (0, 1, 100000);
# ワークシートをアクティブにする
$south->activate();
# 先頭列の幅を設定
$south->set_column(0, 0, 20);
# セルをアクティブにする
$south->set_selection(0, 1);
この例は価格が上がったか、下がったかを示す色が付いた条件付き数値書式の使い方を示します。
use strict;
use Spreadsheet::WriteExcel;
# 新しいワークブックを作成し、ワークシートを追加
my $workbook = Spreadsheet::WriteExcel->new("stocks.xls");
my $worksheet = $workbook->addworksheet();
# 列1,2,3,4の幅を設定
$worksheet->set_column(0, 3, 15);
# 列見出しのための書式を作成
my $header = $workbook->addformat();
$header->set_bold();
$header->set_size(12);
$header->set_color('blue');
# 株価のための書式を作成
my $f_price = $workbook->addformat();
$f_price->set_align('left');
$f_price->set_num_format('$0.00');
# 株価取引高のための書式を作成
my $f_volume = $workbook->addformat();
$f_volume->set_align('left');
$f_volume->set_num_format('#,##0');
# 価格変更のための書式を作成。これは条件付書式の例です。
# 数値はパーセントとして書式化されます。正の値であれば、それは緑で書式化
# されます。負の値であれば、赤で、0であればデフォルトのフォント色(この場合は黒)で
# 書式化されます。
# 注意: [Green]書式はライムグリーンになります。
# ダークグリーンには代わりに[Color 10]をお使いください
#
my $f_change = $workbook->addformat();
$f_change->set_align('left');
$f_change->set_num_format('[Green]0.0%;[Red]-0.0%;0.0%');
# データを出力
$worksheet->write(0, 0, 'Company',$header);
$worksheet->write(0, 1, 'Price', $header);
$worksheet->write(0, 2, 'Volume', $header);
$worksheet->write(0, 3, 'Change', $header);
$worksheet->write(1, 0, 'Damage Inc.' );
$worksheet->write(1, 1, 30.25, $f_price ); # $30.25
$worksheet->write(1, 2, 1234567, $f_volume); # 1,234,567
$worksheet->write(1, 3, 0.085, $f_change); # 緑で 8.5%
$worksheet->write(2, 0, 'Dump Corp.' );
$worksheet->write(2, 1, 1.56, $f_price ); # $1.56
$worksheet->write(2, 2, 7564, $f_volume); # 7,564
$worksheet->write(2, 3, -0.015, $f_change); # 赤で-1.5%
$worksheet->write(3, 0, 'Rev Ltd.' );
$worksheet->write(3, 1, 0.13, $f_price ); # $0.13
$worksheet->write(3, 2, 321, $f_volume); # 321
$worksheet->write(3, 3, 0, $f_change); # フォントの色(黒)で 0
以下に関数を使った簡単な例を示します。
#!/usr/bin/perl -w
use strict;
use Spreadsheet::WriteExcel;
# 新しいワークブックを作成し、ワークシートを追加
my $workbook = Spreadsheet::WriteExcel->new("stats.xls");
my $worksheet = $workbook->addworksheet('Test data');
# 列1に列幅を設定
$worksheet->set_column(0, 0, 20);
# 見出しのための書式を作成
my $format = $workbook->addformat();
$format->set_bold();
# サンプルデータを出力
$worksheet->write(0, 0, 'Sample', $format);
$worksheet->write(0, 1, 1);
$worksheet->write(0, 2, 2);
$worksheet->write(0, 3, 3);
$worksheet->write(0, 4, 4);
$worksheet->write(0, 5, 5);
$worksheet->write(0, 6, 6);
$worksheet->write(0, 7, 7);
$worksheet->write(0, 8, 8);
$worksheet->write(1, 0, 'Length', $format);
$worksheet->write(1, 1, 25.4);
$worksheet->write(1, 2, 25.4);
$worksheet->write(1, 3, 24.8);
$worksheet->write(1, 4, 25.0);
$worksheet->write(1, 5, 25.3);
$worksheet->write(1, 6, 24.9);
$worksheet->write(1, 7, 25.2);
$worksheet->write(1, 8, 24.8);
# 統計関連の関数を出力
$worksheet->write(4, 0, 'Count', $format);
$worksheet->write(4, 1, '=COUNT(B1:I1)');
$worksheet->write(5, 0, 'Sum', $format);
$worksheet->write(5, 1, '=SUM(B2:I2)');
$worksheet->write(6, 0, 'Average', $format);
$worksheet->write(6, 1, '=AVERAGE(B2:I2)');
$worksheet->write(7, 0, 'Min', $format);
$worksheet->write(7, 1, '=MIN(B2:I2)');
$worksheet->write(8, 0, 'Max', $format);
$worksheet->write(8, 1, '=MAX(B2:I2)');
$worksheet->write(9, 0, 'Standard Deviation', $format);
$worksheet->write(9, 1, '=STDEV(B2:I2)');
$worksheet->write(10, 0, 'Kurtosis', $format);
$worksheet->write(10, 1, '=KURT(B2:I2)');
以下の例はtab.txtと呼ばれるタブ区切りのファイルをtab.xlsというExcelファイルに変換します。
#!/usr/bin/perl -w
use strict;
use Spreadsheet::WriteExcel;
open (TABFILE, "tab.txt") or die "tab.txt: $!";
my $workbook = Spreadsheet::WriteExcel->new("tab.xls");
my $worksheet = $workbook->addworksheet();
# 行と列は0始まり
my $row = 0;
while (<TABFILE>) {
chomp;
# 1つのタブで分割
my @Fld = split('\t', $_);
my $col = 0;
foreach my $token (@Fld) {
$worksheet->write($row, $col, $token);
$col++;
}
$row++;
}
通常のインストールを行えれば、以下の例のファイルが~/site/Spreadsheet/WriteExcel/examplesディレクトリにコピーされてます:
入門
===============
simple.pl いくつかの基本的な機能の例
regions.pl 複数ワークシートのデモ
stats.pl 基本的な式と関数
formats.pl 利用できる書式設定のデモの作成
高等
========
stocks.pl 条件付書式のデモ
chess.pl プロパティを使った書式設定の例
stats_ext.pl stats.plと同じ 外部リファレンスを利用
cgi.pl 簡単なCGIプログラム
mod_perl.pl 簡単なmod_perlプログラム
hyperlink.pl ハイパーリングの作り方を示す
merge1.pl セル結合の簡単な例
merge2.pl さらに高度なセル結合の例
merge3.pl ハイパーリンクと垂直な結合の組み合わせ
textwrap.pl テキスト折り返しオプションのデモ
panes.pl ウィンドウ枠の作り方の例
copyformat.pl セル書式のコピーの例
win32ole.pl 比較のためのWin32::OLEのサンプル
easter_egg.pl Excel97フライト・シュミレータの暴露 見るべき。
ユーティリティ
=======
convertA1.pl A1記法を扱うためのヘルパー関数
lecxe.pl Win32::OLEを使ってExcelをWriteExcelに変換
csv2xls.pl CSVをExcelファイルに変換するプログラム
tab2xls.pl タブ区切りファイルをXLSファイルに変換するプログラム
datecalc1.pl Unix/Perl時刻をExcel時刻に変換
datecalc2.pl Excel日付をDate::Calcを使って計算
writemany.pl 2次元配列の値を一発で出力
開発者向け
=========
function_locale.pl 英語以外の関数名をFormula.pmに追加
filehandle.pl ファイルハンドルの扱う例.
writeA1.pl モジュールの拡張方法の例
comments.pl Excel5ワークシートにセル・コメントを追加
bigfile.pl OLE::Storage_Liteを使って7MBの制限を越えて出力
Spreadsheet::WritExcelを使ったCGIアプリケーションの追加の例が German Unix/web journal iXのウェブサイトから利用できます:
ftp://ftp.heise.de/pub/ix/ix_listings/2001_06/perl.tgz
以下の制約がExcelあるいは実装されているBIFFファイルのバージョンによって附与されています。
説明 制約 元
----------------------------------- ------ -------
文字列での最大文字数 255 Excel 5
最大列数 256 Excel 5, 97
Excel5での最大行数 16,384 Excel 5
Excel97での最大行数 65,536 Excel 97
シート名の最大文字数 32 Excel 5, 97
注意:式での行参照の最大値はExcel5の行の制限16384です。
OLEオーバーヘッドのために最小ファイルサイズは6Kです。最大ファイルサイズはBIFFデータでおよそ7MB(7087104バイト)です。これはTakanori KawaiのOLE::Storage_Liteモジュールhttp://search.cpan.org/search?dist=OLE-Storage_Liteを使って拡張することができます。ディストリビューションのexamplesディレクトリにあるbig.plの例をご覧ください。
このモジュールはPerl 5.005 (以降) とParse::RecDescent: http://search.cpan.org/search?dist=Parse-RecDescent を必要とします。
Spreadsheet::WriteExcel.pmはWindows、UNIXそしてMacintoshプラットホームの多くで機能します。特に64ビットiEEE形式でperlが浮動小数点数をパックするすべてのシステムで機能します。浮動小数点はリトルエンディアン形式にもなります。しかしWriteExcel.pmは必要なときに以下のように逆にします:
print join(" ", map { sprintf "%#02x", $_ } unpack("C*", pack "d", 1.2345)), "\n";
これは以下のような結果に(あるいはその反対に)なります:
0x8d 0x97 0x6e 0x12 0x83 0xc0 0xf3 0x3f
一般的に、あなたのシステムが64ビットIEEE浮動小数点をサポートしているかどうかわかななければ、それはおそらくサポートしているでしょう。もしあなたのシステムがサポートとしていなければ、WriteExcelは診断メッセージセクションで説明したメッセージでcroak()します。以下のサイトからCPANテスターがどのプラットホームでこのモジュールでテストしているかをチェクすることができます:http://testers.cpan.org/search?request=dist&dist=Spreadsheet-WriteExcel
Excelデータは"バイナリ交換ファイルフォーマット(Binary Interchange File Format)"(BIFF)ファイル形式で格納されます。このフォーマットの詳細についてはExcel SDK、Microsoft Pressから出ている"Excel Developer's Kit"で得ることができます。同様にMSDN CDライブラリにも含まれていますが、もはやMSDN ウェブサイトからは利用できません。BIFFドキュメントの古いバージョンはhttp://www.cubic.org/source/archive/fileform/misc/excel.txt で利用することができます。
Excel SDKに関連する問題については時折、 news://microsoft.public.excel.sdkで議論されます。
ExcelファイルのBIFF部分は連続するバイナリ・レコードによって構成され、それぞれは異なる機能を持ち、異なるタイプのデータを保持します。各BIFFレコードは以下の3つの部分を持ちます:
レコード名; 16進数の識別子。長さ=2バイト
レコード長; 後に続くレコードの長さ。 長さ=2バイト
レコード・データ: データ。長さ=可変長
BIFFデータは他のデータとともにOLE複合ファイルに格納されます。これは構造化された記憶領域であり、ファイルの入ったファイルシステムのように動きます。複合ファイルは記憶領域とストリームにより構成され、それはファイル・システムの類似、ディレクトリとファイルのように従います。
OLE::Storageモジュールのためのドキュメント、 http://user.cs.tu-berlin.de/~schwartz/pmh/guide.html にはパブリック・ドメインでのOLE複合ファイルの説明が2、3入っています。
OLEライブラリのオープン・ソースでの実装ためには、 http://atena.com/libole2.php にある'cole'ライブラリをご覧ください。
GnumericスプレッドシートのExcelプラグインのためのソースコードにも Excel BIFF形式とOLEコンテナに関連する情報が入っています、http://www.ximian.com/apps/gnumeric.php3 と ftp://ftp.ximian.com/pub/ximian-source/
さらにOpenOfficeのソースコードはhttp://www.openoffice.org/ にあります。
Spreadsheet::WriteExcelの説明と、それがどのように機能するかについての記事は The Perl Journal #19に載っています。http://www.tpj.com/ 。それは親切な許可によってディストリビューションのdocディレクトリに再現されています。
この情報を用意することはBIFFまたはOLEファイル情報のハッキングを始めさせようとしているというわけではないということに注意してください。あなたの時間を浪費するのにはもっといろんな方法があるんですから;-)
あなたの要求、背景、一般的な感覚によって、Excelへデータを入れるために以下の方法のいずれかをとることができます:
* CSV, カンマで区切られた変数またはテキスト。ファイルの拡張子がcsvおであれば、Excelはオープンし、そのフォーマットを自動的に変換します。適切なCSVファイルは見た目ほど簡単ではありません。DBD::RAM、DBD::CSVそしてText::CSV_XSモジュールをご覧ください。
* DBI + DBD::ADO または DBD::ODBC。Excelファイルは内部のインデックス・テーブルを持ち、データベース・ファイルにように機能することを可能にしています。標準的なPerlデータベースモジュールの1つを使って、Excelファイルにデータベースとして接続することができます。
* DBD::Excel, Kawai TakanoriのDBD::Excelモジュール http://search.cpan.org/search?dist=DBD-Excel を通して標準のDBIインターフェースを使ってSpreadsheet::WriteExcelにアクセスすることもできます。
* Win32::OLEモジュールとオフィスオートメーション。これはWindowsプラットホームとインストールされたExcelのコピーを必要とします。これがExcelとインターフェースをとる最も一般的で、完全な方法です。http://www.activestate.com/ASPN/Reference/Products/ActivePerl-5.6/faq/Windows/ActivePerl-Winfaq12.html と http://www.activestate.com/ASPN/Reference/Products/ActivePerl-5.6/site/lib/Win32/OLE.html をご覧ください。
メインのプラットホームがUNIXだけれども別にWin32/MSOfficeサーバーをセットアップするリソースを持っているのであれば、オフィスドキュメントをWin32::OLEを使ってテキスト、ポストスクリプトまたはPDFに変換することができます。これをPerlを使ってどのようにおこなうかについてのデモンストレーションはDocserver:http://search.cpan.org/search?mode=module&query=docserver をご覧ください。
* HTMLテーブル。これは書式設定を追加するのに簡単な方法です。
* XML, Excel XMLとHTMLファイルの仕様は以下のサイトから取得できます:http://msdn.microsoft.com/library/officedev/ofxml2k/ofxml2k.htm
Excelファイルからデータを読み込むためには以下のことを試してみてください:
* Spreadsheet::ParseExcel.。これはOLE::Storage-Liteを使い、Excelファイルからデータを取り出すのを容易にします。http://search.cpan.org/search?dist=Spreadsheet-ParseExcel
* OLE::Storage, いわゆる LAOLA。これはOLEファイル・フォーマットへのPerlインターフェースです。特にこのディストリビューションにはHerbertといわれるExcelからHTMLへのコンバータがはいっています。http://user.cs.tu-berlin.de/~schwartz/pmh/ またLAOLAの成果を元にしたオープンソースのC/C++プロジェクトもあります。Filters Project http://arturo.directmail.org/filtersweb/ と ExcelからHTMLへのコンバーター xlHtmlプロジェクト http://www.xlhtml.org/ を試してみてください。
* HTMLテーブル。 ExcelからHTMLフォーマットに保管されれば、データはHTML:TableExtractを使ってアクセスすることができます。http://search.cpan.org/search?dist=HTML-TableExtract
* DBI + DBD::ADO または DBD::ODBC。セクションEXCELファイルの出力方法をご覧ください。
* DBD::Excel, Kawai TakanoriのDBD::Excelモジュール http://search.cpan.org/search?dist=DBD-Excel を通して標準のDBIインターフェースを使ってSpreadsheet::ParseExcelにアクセスすることもできます。
* XML::Excel はSpreadsheet::ParseExcel を使ってExcelファイルをXMLに変換します http://search.cpan.org/search?dist=XML-Excel.
* Win32::OLEモジュールとオフィス・オートメーション。セクションEXCELファイルの出力方法をご覧ください。
もしUNIX/LinuxプラットホームでExcelファイルを見たければ、素晴らしいGnumericスプレッドシート・アプリケショーンをチェックしてください。http://www.gnumeric.org/gnumericまたはOpenOffice http://www.openoffice.org/
もしExcelファイルをExcelがインストールされていないWindowsプラットホームで見たければ、フリーのMicrosoft Excel Viewerを使うことができます。http://officeupdate.microsoft.com/2000/downloaddetails/xlviewer.htm
オレンジではありません。(訳者の悩み:Orange isn't って何?)
Formulasはformulae。
Spreadsheet::ParseExcel: Spreadsheet::WriteExcelで作られた式は、値で0として読み込まれます。これはSpreadsheet::WriteExcelが式だけだけを格納し、計算結果を格納しないからです。
OpenOffice: Spreadsheet::WriteExcelにいくつかないレコードがあるため、数値書式が表示されません。C++についてそしておそらくはドイツ語の知識がある人が、これについてOpenOfficeソースを調べるのを助けてくれるかもしれません。URLはリンクとして表示されません。
Gnumeric: いくつかの書式が正しく表示されません。URLはリンクとして表示されません。
MS Access: このモジュールにより作成されたExcelファイルはMS Accessと互換性がありません。代わりにDBI またはODBC をお使いください。
QuickView: QuickViewでの完全な互換性をもつファイルを出力したければ、行毎の順序でセルを出力する必要があります。
リトルエンディアン64ビットIEEE浮動小数点数の出力で移植性に欠けます。
ロードマップは以下の通り:
将来のリリースを追い続けるためには、Freshmeat http://freshmeat.net/ にユーザ登録し、プロジェクトページにあるSpreadsheet::WriteExcelに http://freshmeat.net/projects/writeexcel/ 参加してください。すると新しいバ−ジョンがリリースされたときに更新がメールで受け取ることが出来ます。代わりにnews://comp.lang.perl.announce を注目することもできます。
(原文のまま)
The following people contributed to the debugging and testing of Spreadsheet::WriteExcel:
Alexander Farber, Arthur@ais, Artur Silveira da Cunha, Borgar Olsen, Cedric Bouvier, CPAN testers, Daniel Berger, Daniel Gardner, Harold Bamford, James Holmes, Johan Ekenberg, J.C. Wren, Kenneth Stacey, Kyle Krom, Michael Buschauer, Mike Blazer, Paul J. Falbe, Paul Medynski, Peter Dintelmann, Reto Badertscher, Rich Sorden, Shane Ashby, Shenyu Zheng, Steve Sapovits.
The following people contributed code or examples:
Andrew Benham, Bill Young, Cedric Bouvier, Ian Penman, Marco Geri, Sam Kington, Takanori Kawai, Tom O'Sullivan.
Additional thanks to Takanori Kawai for translating the documentation into Japanese: http://homepage3.nifty.com/hippo2000/perltips/Spreadsheet/WriteExcel.htm
Peter Dintelmann and Christian Kirsch wrote an article entitled "Excel-Dateien mit Perl erstellen - Controller im Glück" for the German Unix/web journal iX: http://www.heise.de/ix/artikel/2001/06/175/
Dirk Eddelbuettel maintains the Debian distro.
Thanks to Damian Conway for the excellent Parse::RecDescent. Thanks to Michael Meeks for his work on Gnumeric.
(原文のまま)
John McNamara jmcnamara@cpan.org
When the cool of the pond makes you drop down on it
When the smell of the lawn makes you flop down on it
When the teenage car gets the cop down on it
The time is here for one more year
And that summer feeling is gonna haunt you
One day in your life.
That summer feeling,
That summer feeling,
That summer feeling.
-- Jonathan Richman.
(原文のまま)
© MM-MMI, John McNamara.
All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。