公開日: 2013年05月27日(Mon)
マイクロソフトがあんまり好きじゃないとか、お金ないんだから OpenOffice.org でいいんじゃないかなどと思ったり、まぁお世話になってる割に、なぜかあんまり好かれない Microsoft Office。 とはいえしかし、日々の業務でこれを捨てられずにずーーーーーーっとやってきたことは間違いなく、なんやかんやと便利だということを認めざるを得ない。
この便利な Office 製品、とりわけ Excel は、数字記録したり集計したり、さらには図まで描いたりと大活躍。これをもっと上手く使いこなしたら、もっといろんなものをすごーーーく便利にできるんじゃないだろうか?
ということで、今回はPHPからエクセルファイルの読み書きを行うライブラリ PHPExcel を試してみることにした。
PHPExcel に入る前に、PHPでエクセルを読み書きできるライブラリは、実は他にもいくつか選択肢がある。
上記ページでまとめられている表を参考に、
の軸でライブラリを選ぶ。
今回は、PHP4は想定しない、古い形式 *.xls はあまり重要じゃない、読み書き両方できた方が便利、というわけで、今回は PHPExcel を使ってみることにした。
次のページからダウンロードした。
今回ダウンロードしたのは、「PHPExcel 1.7.8 - with Documentation in PDF format」。
配布形式はたくさんあるが、ほとんどドキュメントのファイル形式が違うだけで、肝心なライブラリファイル自体は変わらないみたい。「Documents Only」と「Phar」以外を選べばどれでもよい。
ここからは、PHPExcelで、PHPからExcelを作成・操作する | Styler を参考に進めてみる。
入手したZIPを解凍すると得られる中の、Classesディレクトリに収められているファイルが、PHPExcelの本体。これを適当なディレクトリに設置する。
<?php
set_include_path(get_include_path().PATH_SEPARATOR.$_SERVER["DOCUMENT_ROOT"].'/Classes/');
?>
末尾の、$_SERVER["DOCUMENT_ROOT"].'/Classes/'
の部分が、追加するインクルードパス。PHPExcelを設置したディレクトリまでの絶対パスをここに書く。上記は、ドキュメントルートの直下にClassesディレクトリを設置した場合の例。
パスを通したら、PHPExcel をインクルードする。
include_once( 'PHPExcel.php' );
これで、PHPExcel のクラスファイル群を使えるようになったはずだ。
データの読み書き編集の中身は一旦後回しにして、編集の始まり(開くところ)と終わり(保存するところ)を先に見ておきたい。
新規エクセルファイルを作成する場合の流れは次のようにする。
<?php
// 新しいエクセルファイルを作成する
$objPHPExcel = new PHPExcel();
/*
この間で、エクセルファイルを編集する。
*/
// "Excel2007" 形式で保存する
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('./sample.xlsx');
?>
クラス PHPExcel
のインスタンスを作成するところで、エクセルファイルを作成している。
ファイルの読み書き編集は、このインスタンス $objPHPExcel
で行なっていくようだ。
保存するときは、別のクラス PHPExcel_IOFactory::createWriter()
で生成したオブジェクトで行う。$objPHPExcel
で編集している間は、まだファイルの形式が決まっていない。書き込みオブジェクトを生成する際に "Excel2007" を指定しているが、ここで出力ファイル形式が決まるようだ。
既存のファイルの読み込みを行う場合は、次の流れになる。
<?php
// 既存ファイルの読み込みの場合
$objPHPExcel = PHPExcel_IOFactory::load("./sample.xlsx");
/*
この間で、エクセルファイルを編集する。
*/
// "Excel2007" 形式で保存する
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('./sample.xlsx');
?>
新規作成と違うのは、最初の行だけ。 PHPExcel_IOFactory::load()
を通じて、既存のエクセルファイルをロードする。
返されるオブジェクトは、新規作成の場合と同じく、クラス PHPExcel
のインスタンスとなる。
ということで、いよいよデータの中身を操作してみる。機能がたくさんありすぎて、全部をやってみると果てしなく時間が掛かりそうなので、特によく使いそうな基本的な機能だけピックアップしてやってみることにする。
まず最初にやらないといけない手順が、シートの選択。エクセルでは、1つのエクセルファイル中に複数のシート(画面の下にあるタブみたいなやつ)が収められている構造になっている。セルデータの読み書きは、シートに対して行うため、シートを選択し、シートオブジェクトを入手しておかないといけない。
// 0番目のシートをアクティブにする(シートは左から順に、0、1,2・・・)
$objPHPExcel->setActiveSheetIndex(0);
// アクティブにしたシートの情報を取得
$objSheet = $objPHPExcel->getActiveSheet();
以降、ここで取得したシートオブジェクトを $objSheet
という名前で表現する。
次のメソッドを使ってシート名を変更できるようなので、命名しておく。
$objSheet->setTitle('テストシート');
選択したシートのセルにデータを書き込んでみる。
$objSheet->getCell('A1')->setValue('テスト');
$objSheet->getCell()
の第1引数にセル座標を指定してセルオブジェクトを取得し、セルオブジェクトの setValue()
メソッドの 第1引数に値を指定する。セル座標は、大文字の "A" から始まるアルファベットで横軸、1 から始まる数値で縦軸を表す。
これと同じ処理を、 $objSheet->setCellValue()
を使って、手続きを省略することもできる。第1引数にセル座標、第2引数に値を指定する。
// setCellValue() で同じ事をする例
$objSheet->setCellValue('A1', 'テスト');
エクセルで使われる数式を入れてみた。次の3行目のように、文字列で式を書いたら、エクセルでちゃんと処理された。
$objSheet->getCell('B1')->setValue(120);
$objSheet->getCell('B2')->setValue(523);
$objSheet->getCell('B3')->setValue('=B1+B2');
逆に、セルの値を取り出す場合は、getValue()
メソッドを使う。
$val = $objSheet->getCell('B3')->getValue();
次は、よく使う「ウィンドウ枠の固定」機能。次のように書くと、セル B2 の左上で固定される。
$objSheet->freezePane('B2');
セル結合も、見やすい表を作るのに欠かせない基本機能の1つ。
$objSheet->mergeCells('A10:D14');
こう書くと、セル A10 から D14 までが1つのセルに結合される。
セルのフォントや、背景色や、罫線を変更することもできる。
セルスタイルは、スタイルオブジェクトに対して読み書きする。セルのスタイルには、デフォルトのスタイルと、指定したセル自体の持つスタイルがあって、それぞれ次のようにしてスタイルオブジェクトを取り出す。
// デフォルトのスタイル
$objStyle = $objSheet->getDefaultStyle();
// セル個別のスタイル
$objStyle = $objSheet->getStyle('B1');
セルスタイル $objStyle
に対して、いくつかのスタイルを設定するサンプルを作ってみた。
// フォント
$objStyle->getFont()->setName('メイリオ');
// フォントサイズ
$objStyle->getFont()->setSize(14);
// セルの下に罫線を引く
$objStyle->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objStyle->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objStyle->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objStyle->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
// 罫線の一括指定
$objStyle->applyFromArray(array(
'borders' => array(
'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN),
'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN)
)
));
// 左寄せ
$objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
// センター寄せ
$objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
// 右寄せ
$objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
// 背景色指定
$objStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);//←fillTypeを設定しないと背景色はつかない。
$objStyle->getFill()->getStartColor()->setRGB('dddddd');
セルの幅や高さを数値で指定できる。数値の単位は、、わからない。(ごめんなさい)
//セルの幅設定
$objSheet->getColumnDimension('B')->setWidth(40);
//セルの高さ設定
$objSheet->getRowDimension('2')->setRowHeight(40);
自動設定にすることもできるようだ。ただ、自動計算は PHPExcel が行なっているため(?)か、フォントのサイズが考慮されていないように見えるので注意が必要。
//セルの幅自動設定
$objSheet->getColumnDimension('A')->setAutoSize(true);
ざっくりググりながらやってみたが、結構高機能。今回は触れなかったが、オートフィルターやオートシェイプなどもできるらしい。出力形式にも、CSVやHTML、PDFも指定できるという記事も見かけた。
今回やってみた範囲でも、とりあえず日々に使うエクセル類を操作するに十分な機能だと思うので、もうしばらく調べながら使い込んでみようと思います。
公開日: 2013年05月27日(Mon)