category

twitter

【PHP】PHPでExcelファイルを読み込む

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Bookmark this on Delicious

ライブラリの入手

php-excel-readerってのがメジャーな様子。
セルの書式(フォント、文字色、背景色等)も読み込めるのでかなり柔軟に使えそう
php-excel-reader

使ってみたら日本語もちゃんと読み込めたので、みんなこれを使えばいいじゃん☆

使用例

拡張子xlsファイルを読み込んで、UTF-8のtsv形式のファイルに変換するサンプルを以下に示します。

//先にDLしたファイルを読み込む
require_once "excel_reader2.php";

//出力用tsvファイルをオープン
$fp = fopen('output.tsv', 'w+');

//コンストラクタ生成
$_wo_xls = new Spreadsheet_Excel_Reader();
//日本語が含まれる場合なマルチバイトの設定を行う
$_wo_xls->setUTFEncoder('mb');
//エクセルは基本Shift_JISなので、読み込む時にUTF-8にする
$_wo_xls->setOutputEncoding('UTF-8');
//エクセルファイル読み込み
$_wo_xls->read('input.xls');

//最大行数の取得
//※ sheetsの1次元目の配列には0から始まるシート番号が入る
$_wi_max_row = $_wo_xls->sheets[0]['numRows'];
echo 'max lines  : '.$_wi_max_row."\n";
//最大列数の取得
$_wi_max_col = $_wo_xls->sheets[0]['numCols'];
echo 'max columns: '.$_wi_max_col."\n";

//セルの情報をforeachでループしながら取得する
foreach ($_wo_xls->sheets[0]['cells'] as $raw) {
	$_wa = array();
	for ($i=1; $i<=$_wi_max_col; $i++) {
		if (array_key_exists($i, $raw)) {
			$_ws = $raw[$i];
			セルの中身に改行がある場合はそれを除去する
			$_ws = str_replace("\n", '', $_ws);
			$_ws = str_replace("\r", '', $_ws);
			$_wa[] = $_ws;
		} else {
			$_wa[] = '';
		}
	}
	fwrite($fp, implode("\t", $_wa)."\n");
}

fclose($fp);
ポイント1

27行目で一見$rawをforeachでループすればいいんじゃないの?って思うけど、このライブラリどうやら空のセルは読み込まないらしい。そのため、先に取得した最大列数までを固定値でループすることで、全行統一されたカラム数が維持できる。

Excelなんてほとんどが空セルだからよくよく考えれば、空のセルを読み込まないってのは当たり前だな。

ポイント2

エクセルは得てして大容量ファイルである。14行目でファイルを読み込む際はPHPのメモリサイズを意識して実行したい。
エクセルが複数シートに別れている場合、シート毎にファイルを分けておいてから処理するのも手だ。

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">