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件のピンバック

コメントする

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


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

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