【PHP】Excelからデータを読み取り連想配列にセットする
PHPでExcelを読み取るには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, ...)とカラム名(テーブル毎に異なる)。