2012年3月2日金曜日

[PHP][Excel][PHPExcel] PHPExcelの導入

PHPからExcelを扱うというのは、意外と顧客からの要望に上がることが多い。

また、仕様書やデータ定義、DB定義などもExcelで書かれていると、
簡単にコピペでプログラムに持ってくることはできない。
だからといっていちいち手作業でDB定義書からCREATE文を作るなどというのも結構手間だ。
そういう時にPHPからExcelを読み取って、自動的にCREATE文を作るなりすると効率がいい。

まずは、PHPExcelの本家サイトからライブラリを落としてこよう。
落としてきたZIPを解凍すると、中にClassesフォルダがある。
この中に必要なクラスが定義されているファイルが入っているので、
これを必要な場所にフォルダごとおいておこう。

後はコードを書くだけ。
試しにExcel内の最初のシートの中身を配列に代入するプログラムを書いてみる。

ABC
1123
2456
3789

上記のような構造のExcelファイルを読み込むとする。

//ClassesをおいたパスからPHPExcel.phpをインクルードする
require_once('Classes/PHPExcel.php');
//読み込むExcelのパス
define('EXCEL','data/test.xls');

//.xls形式を読むという設定でクラスと作る
//.xlsx形式を読み込む場合は'Excel5'の部分を'Excel2007'に変える →$reader=PHPExcel_IOFactory::createReader('Excel2007');
$reader=PHPExcel_IOFactory::createReader('Excel5');
//読み込むExcelのパスを指定する
$excel=$reader->load(EXCEL);
//最初のシートを選ぶ
$sheet=$excel->setActiveSheetIndex(0);

$data=array();
//行イテレータ取得
foreach($sheet->getRowIterator() as $row)
{
    $tmp=array();
    //列イテレータ取得
    foreach($row->getCellIterator() as $cell)
    {
        //セルの値取得
        $tmp[]=$cell->getValue();
    }
    $data[]=$tmp;
}

//整形して出力
echo '<pre><code>';
var_dump($data);
echo '</code></pre>';

出力結果はこんな感じになる。
array(3) {
  [0]=>
  array(3) {
    [0]=>
    float(1)
    [1]=>
    float(2)
    [2]=>
    float(3)
  }
  [1]=>
  array(3) {
    [0]=>
    float(4)
    [1]=>
    float(5)
    [2]=>
    float(6)
  }
  [2]=>
  array(3) {
    [0]=>
    float(7)
    [1]=>
    float(8)
    [2]=>
    float(9)
  }
}

しかし、このままのソースだと例えば

ABC
113
25
378

のような虫食い状態のデータの時に下記のような結果になる。

array(3) {
  [0]=>
  array(2) {
    [0]=>
    float(1)
    [1]=>
    float(3)
  }
  [1]=>
  array(1) {
    [0]=>
    float(5)
  }
  [2]=>
  array(2) {
    [0]=>
    float(7)
    [1]=>
    float(8)
  }
}

上記プログラムだと空の場合は読み飛ばしてしまうため、
配列の添字が詰められてしまう。
データが開いてる時は配列も開けておきたい場合は

//ClassesをおいたパスからPHPExcel.phpをインクルードする
require_once('Classes/PHPExcel.php');
//読み込むExcelのパス
define('EXCEL','data/test.xls');

//.xls形式を読むという設定でクラスと作る
//.xlsx形式を読み込む場合は'Excel5'の部分を'Excel2007'に変える →$reader=PHPExcel_IOFactory::createReader('Excel2007');
$reader=PHPExcel_IOFactory::createReader('Excel5');
//読み込むExcelのパスを指定する
$excel=$reader->load(EXCEL);
//最初のシートを選ぶ
$sheet=$excel->setActiveSheetIndex(0);

$data=array();
//列の最大値を取得
for($i=1;$i<=$sheet->getHighestRow();$i++)
{
    $tmp=array();
    //行の最大値を取得
    //A、B、Cの文字列形式で帰ってくるので数字に変換する
    $max_column=PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
    for($j=0;$j<$max_column;$j++)
    {
        //列のインデックスと、行のインデックスからセルの値を取得
        $tmp[]=$sheet->getCellByColumnAndRow($j,$i)->getValue();
    }
    $data[]=$tmp;
}

//整形して出力
echo '<pre><code>';
var_dump($data);
echo '</code></pre>';

とすると出力結果は

array(3) {
  [0]=>
  array(3) {
    [0]=>
    float(1)
    [1]=>
    NULL
    [2]=>
    float(3)
  }
  [1]=>
  array(3) {
    [0]=>
    NULL
    [1]=>
    float(5)
    [2]=>
    NULL
  }
  [2]=>
  array(3) {
    [0]=>
    float(7)
    [1]=>
    float(8)
    [2]=>
    NULL
  }
}

となる。

次へ

0 件のコメント:

コメントを投稿