PHPExcelのちょっとつかえる小技

こんにちは。松田です。
先日PHPでExcelを扱う機会があったので、その際に活躍したライブラリPHPExcelで便利だったメソッドを少しだけ書いておきたいと思います。

PHPExcelの基本的な部分は弊社笹亀が以前こちらに書いていたので、基本的な使い方はこちらをご参考ください。


・既存のExcelファイルを読み込み、セルに値を入れて出力

すでにベースとなるExcelファイルが存在している場合に使える方法です。
一からスクリプトでExcelファイルを作成するのと比べ、既存のExcelの書式やスタイル等がそのまま使用できるので大幅に開発効率をあげることができます。


<?php
// 導入部分省略
// base_excel_file.xlsを読みこむ
$reader = PHPExcel_IOFactory::createReader('Excel5');
$this->excel = $reader->load('base_excel_file.xls');
// セルA1に値を入れる
$this->excel->getActiveSheet()->setCellValue('A1', 'ほげほげ');

ただし、これを使用してExcelを読み込むと大量にメモリを消費する上、Excelの生成時間も大幅に増えてしまうので注意しましょう。


・セルのスタイルのコピー

上記の方法でExcelを作る場合に問題となるのが、動的に表の行数を変化させる場合です。
この場合、Excelの行数がレコード数によって変化するため、用意しておくExcelファイルの書式設定を何行目まで設定しておけばよいのかがあらかじめ決定できません。
そんなときに使えるのがセルのスタイルのコピーです。
用意しておくExcelファイルでは基本となる一行だけ最初に書式設定を済ませておき、2行目以降の動的に生成するセルには1行目からスタイルをコピーしていきます


<?php
// 導入部分省略
// A1のスタイルをB1にコピー
$sheet = $this->excel->getActiveSheet();
$style = $sheet->getStyle('A1');
$sheet->duplicateStyle($style, 'B1');

これを利用して、A1~Z1までの行のスタイルをA2~Z2にコピーするには次のように書いたりすることもできます。


<?php
$sheet = $this->excel->getActiveSheet();
// AからZまでの文字番号をord()で取得してインクリメント
for ($char = ord('A'); $char <= ord('Z'); $char++) {
  $style = $sheet->getStyle($char . '1');
  
  // 生成された文字番号からchr()で文字列に戻す
  $sheet->duplicateStyle($style, chr($char) . '2');
}

ただし、Excel上ではZ以降の文字列がAA、AB、AC・・・となるため、ある程度限られた場所でしか使えません。

行数と列数を数値で指定して設定する方法もあるような気はするのですが・・・まだ勉強中です。。

-----------------------------------------
2009/08/07 追記

書こうと思ってたのを一つ忘れていたので追記。

セルに「ユーザー定義の書式設定」を適用

スクリプトからユーザー定義の書式設定をセルに設定することができます。
基本は元ファイルからのセルのコピーで済ましたほうが楽ですが、こちらもたまにお世話になります。

>>PHP

$sheet = $this->excel->getActiveSheet()
$sheet->getStyle('A1')->getNumberFormat()->setFormatCode('yyyy/m/d h:mm');