前回、PHPExcelというライブラリを介してPHPでエクセルファイルを読み込んでみた。

読み込みはファイルのパスを直打ちで指定しての対応で、


これでは汎用性に欠けるということで

今回はファイルのアップロードにも対応できるように改変してみた。

先に改変したコードを載せると、


<?php
//ファイルがアップロードされた場合にエクセルファイルの読み込みを開始する
if(count($_FILES)){

	//Classesディレクトリを配置したパスを指定
	$path = "Classes/";
	require_once($path . "PHPExcel.php");
	require_once($path . "PHPExcel/IOFactory.php");

	//ファイル名から拡張子を調べる仕様に変更
	preg_match('/[^.]+$/', $_FILES["file"]["name"], $tmp);
	$extension = $tmp[0];

	$filepath = $_FILES["file"]["tmp_name"];

	//xls
	if($extension == "xls"){
		$xls = PHPExcel_IOFactory::load($filepath);
	//xlsx
	}else{
		$xls = PHPExcel_IOFactory::createReader('Excel2007')->load($filepath);
	}

	//ファイル内に複数のシートがある時対応
	foreach ($xls->getSheetNames() as $i => $sheetName) {

		//下記二行で$i番目のシートを開く
		$xls->setActiveSheetIndex($i);
		$sheet = $xls->getActiveSheet();

		//各行を取得 $rには行番号が格納される
		foreach ($sheet->getRowIterator() as $r => $row) {

			//セルを取得 $cには列の記号(AとかB)が格納される
			foreach ($row->getCellIterator() as $c => $cell) {

				//セル内の値を出力
				echo $c . $r . ":" . $cell->getCalculatedValue() . "<br>";
			}
		}
	}
}
?>
<form enctype="multipart/form-data" method="post">
	<input type="file" name="file">
	<input type="submit" value="upload">
</form>

改修したところは、

ファイルのアップロードが実行されない限りファイルを読み込まないことと、

コードの末尾にHTMLでフォームの記述が追加されたことぐらい。

ファイルの拡張子とファイルのパスは$_FILESに格納された値を使用している。


このコードを実行してみると、



フォームが表示され、

昨日の記事で作成したxlsファイルを指定してアップロードしてみると、



先日の記事同様、どのセルに何の値があるかを表示できた。