Hatena::ブログ(Diary)

130単位

2009-05-07

PHPExcel xlsファイルのデータを読み込む

PHPExcelを使ってみた ループ編 - 130単位

前回はファイル出力を試しましたが、今回は逆にファイルからデータの読み込みをしてみます。CSVのような単純な構造のシートを想定したとき、その中の各セルの値を繰り返し処理で取得するにはどうするか、です。

同梱されているサンプルの「Test/28iterator.php」を参考にして書いてみました。

<?php
//ライブラリのインクルード
set_include_path(get_include_path() . PATH_SEPARATOR . './PHPExcel/Classes/');
include 'PHPExcel.php';
include 'PHPExcel/IOFactory.php';

//ファイルを読み込んでインスタンス化 (※Excel2003以前の形式)
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load('test.xls');

//アクティブなシートを変数に格納
$objPHPExcel->setActiveSheetIndex(0);
$worksheet = $objPHPExcel->getActiveSheet();

$list = array();
//行でループ
foreach ($worksheet->getRowIterator() as $row) {
    //ヘッダが2行分あったとして、それを飛ばす処理
    if ($row->getRowIndex() < 3) {
        continue;
    }

    $data = array();
    //列でループ
    foreach ($row->getCellIterator() as $cell) {
        if (!is_null($cell)) {
            $data[] = $cell->getValue();
        }
    }
    $list[] = $data;
}

var_dump($list);

こんな感じで、各セルの値が格納された二次元配列な$listができます。

留意点

  • 列のループの最後で$cellはnullとなってforeachの中をまわる
    • そのため!is_null()の判定が必要になってくる
    • 判定をしていないとgetValue()で落ちる
  • 値のないセルをgetValue()すると、NULLが返る
  • setIterateOnlyExistingCells()
    • セルのイテレータのメソッド
    • ループの前にfalseをセットしておくと、255列すべてみにいくようになる
    • デフォルトの値はtrue

【追記】

$data[] = $cell->getValue();

ここのところ、値が取れずによくわからないオブジェクトが取れてしまう現象に出くわしました。対象のセルの値が半角英数のみのときに発生しました。

$data[] = (string) $cell->getValue();

そこで、このように書いたら値(文字列)として取ることができました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証