PHPでエクセルを読む Spreadsheet_Excel_Reader

以前のエントリ id:smeghead:20070525:phpexcel で、PHPからエクセルを読み込むのを諦めて、sylk形式のファイル読み込みにすることで逃げてたんですが、実は簡単でした。

http://green0.rdap.jp/index.html

id:f-ikesan さんに Spreadsheet_Excel_Reader というものを教えてもらって、Spreadsheet_Excel_Readerを試してみたら、何の問題なくExcelに記述された内容を取得できました。(今のところ)

IDjob
jackdoctor
anapolice
END_OF_DATA

というエクセルがあった場合、

Array
(
  [0] => Array
  (
    [ID] => jack
    [job] => doctor
  )
  [1] => Array
  (
    [ID] => ana
    [job] => police
  )
)

という形で取得するために以下のクラスを用意しました。

<?php
/**
 * Excelファイルを読むクラス。
 * 各カラムのデータをHashの配列に格納し返却する。
 *
 * $reader = new ExcelReader("path/to/excel.xls");
 * print_r $reader->get_data();
 * 1行目のデータはカラム名として扱う。
 * 2行目移行のデータをレコードとして扱います。
 * 各レコードは、カラム名をキー、データを値としたHashに変換される。
 * END_OF_DATAが表れたらレコードの読み込みを終了する。
 */
class ExcelReader {
  protected $data;
  public function __construct($file_name_or_array) {
    if (is_array($file_name_or_array)) {
      $files = $file_name_or_array;
    } else {
      $files = array($file_name_or_array);
    }
    require_once 'Excel/reader.php';
    $xls = new Spreadsheet_Excel_Reader();
    $xls->setOutputEncoding('UTF-8');
    foreach ($files as $file_name) {
      $xls->read($file_name);
      for ($i = 1; $i <= $xls->sheets[0]['numRows']; $i++) {
        for ($j = 1; $j <= $xls->sheets[0]['numCols']; $j++) {
          if (!isset($xls->sheets[0]['cells'][$i][$j])) continue;
          $col_data = $xls->sheets[0]['cells'][$i][$j];
          if ($col_data == 'END_OF_DATA') break 2;
          if ($i == 1) {
            //1行目のレコードはカラム名として扱う。
            $column_names[$j - 1] = $col_data;
          } else {
            $this->data[$i - 1][$column_names[$j - 1]] = $col_data;
          }
        }
      }
    }
  }
  public function get_data() {
    return $this->data;
  }
  public function find($id) {
    foreach ($this->data as $item) {
      if ($item["ID"] == $id) return $item;
    }
    return null;
  }
}
?>

追記20070619:クラスコメント間違ってました。

これで、Excelを読取専用データストレージとして動くWebアプリが作れます。

3件のピンバック

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください