Webエンジニア 新人日記

Webエンジニアになりました。元々はCOBOLやらBASICやらでプログラムしてました。C言語やVisualBasicは趣味でやっていましたが、久々に現場復帰ということです。資格はエンベデッドスペシャリスト、DBスペシャリスト、ネットワークスペシャリスト、セキュリティスペシャリスト、システムアーキテクト、プロジェクトマネージャ他を所有

【PHP】Excelからデータを読み取り連想配列にセットする

PHPExcelを読み取るにはPHPExcelを使う。
ライブラリをあらかじめダウンロードしておいて展開しておく。

//PHPExcelファイルの読み込み
include_once ( dirname(__FILE__) . '/Classes/PHPExcel.php');
include_once ( dirname(__FILE__) . '/Classes/PHPExcel/IOFactory.php');

エラーチェックは入念に。といいつつ、社内向けなので手抜きしてます。

//拡張子の取得
$fileext = mb_strtolower((new SplFileInfo($_FILES["upload"]["name"]))->getExtension());
//エラーチェック
if($_FILES['upload']['error'] == UPLOAD_ERR_INI_SIZE || $_FILES['upload']['error'] == UPLOAD_ERR_FORM_SIZE){
	$msg = 'ファイルが大きすぎます';
} else if($_FILES['upload']['error'] != 0){
	$msg = 'その他のエラーが発生しました:コード=' . $_FILES['upload']['error'];
} else if($fileext != 'xls' && $fileext != 'xlsx'){
	$msg = 'Excelファイルのみアップロードできます';
}

実際の読み取り部分は

//ファイル形式(拡張子)により読み取りを変える
$reader=null;
if($fileext == 'xls'){
	$reader = PHPExcel_IOFactory::createReader( 'Excel5' );
} else if($fileext == 'xlsx') {
	$reader = PHPExcel_IOFactory::createReader( 'Excel2007' );
}
if($reader){
//Excelファイルの読み込み
//必ず最初のシートにデータを保存すること
	$excel = $reader->load( $_FILES['upload']['tmp_name'] );
	$excel->setActiveSheetIndex(0);
	$sheet = $excel->getActiveSheet();
//配列で返す
	$obj = $sheet->toArray( null, true, true, true );

}

ファイルはサーバ上の一時領域に保存してある。
スクリプト終了時に削除される(はず)。

この場合、$objに連想配列で格納されている。
連想配列のキーは、行番号(1, 2, 3, ...)と列番号(A, B, C, ...)であり、わかりにくいかも。

そこで、1行めにカラム名を設定しておけば、連想配列のキーとして設定できる。

$keyarray=array();
$dataarray=array();
foreach($obj as $rowindex=>$rowdata){
	if($rowindex == '1'){
		//1行目にカラム名として連想配列のキーが入っている
		foreach($rowdata as $key=>$value){
			$keyarray[$key]=mb_strtolower(substr($value, 2));
		}
	} else {
		//2行目以降は、1行目で求めたカラム名を連想配列のキーとする
		foreach($rowdata as $key=>$value){
			$dataarray[$rowindex-1][$keyarray[$key]] = $value;
		}
	}
}

この場合、$dataarrayにデータが格納されており、キー項目は
行番号(1, 2, 3, ...)とカラム名(テーブル毎に異なる)。