【PHP】PHPExcel を使ってPHPでエクセルファイルを読み書きしてみた。

PHPExcel

マイクロソフトがあんまり好きじゃないとか、お金ないんだから OpenOffice.org でいいんじゃないかなどと思ったり、まぁお世話になってる割に、なぜかあんまり好かれない Microsoft Office。 とはいえしかし、日々の業務でこれを捨てられずにずーーーーーーっとやってきたことは間違いなく、なんやかんやと便利だということを認めざるを得ない。

この便利な Office 製品、とりわけ Excel は、数字記録したり集計したり、さらには図まで描いたりと大活躍。これをもっと上手く使いこなしたら、もっといろんなものをすごーーーく便利にできるんじゃないだろうか?

ということで、今回はPHPからエクセルファイルの読み書きを行うライブラリ PHPExcel を試してみることにした。

ライブラリを選ぶ

PHPExcel に入る前に、PHPでエクセルを読み書きできるライブラリは、実は他にもいくつか選択肢がある。

上記ページでまとめられている表を参考に、

  • エクセル、と一言で言っても、 *.xls と *.xlsx という新旧種類の形式があって、まったく別物。
  • PHP 4系 に対応しているか、または5系のみか。
  • 読み込みのみ、書き込みのみ、または両方できる。

の軸でライブラリを選ぶ。

今回は、PHP4は想定しない、古い形式 *.xls はあまり重要じゃない、読み書き両方できた方が便利、というわけで、今回は PHPExcel を使ってみることにした。

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 のクラスファイル群を使えるようになったはずだ。

Excelファイルの作成(または読み込み)と保存

データの読み書き編集の中身は一旦後回しにして、編集の始まり(開くところ)と終わり(保存するところ)を先に見ておきたい。

新規エクセルファイルを作成する場合の流れは次のようにする。

<?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も指定できるという記事も見かけた。

今回やってみた範囲でも、とりあえず日々に使うエクセル類を操作するに十分な機能だと思うので、もうしばらく調べながら使い込んでみようと思います。


プロフィール

コヤナギ トモヤ

ウェブ系エンジニアしてます。ウェブデザイナー、ウェブディレクターとしてウェブ制作の仕事に携わり、今はエンジニア職に流れ着きました。誰かのお仕事をちょっとだけ効率化するような支援ツールの開発が好き。オープンソースとMITライセンス大好き。人生後半は自由と民主主義のコントリビューターとして過ごす予定。

ウェブ制作支援ツール Pickles 2 をオープンソースで開発しています。

PHP/JavaScript/NodeJS/nwjs/Laravel/Pickles2/オープンソース/心理学/倫理/自由と民主主義

RSSフィード

ページの先頭へ戻る