問題 × 解決策

PHPExcelを使って、Excelファイルを読み込む方法

  • 2020年01月14日
  • PHP

問題

PHPでExcelファイルを読み込んで、自由なフォーマットで表示させたい。

解決策

PHPExcelを使用する。

 

PHPでExcelファイルを読み込むライブラリ

PHPでExcelファイルを読み込むライブラリのうちの一つ「PHPExcel」を使ってExcelファイルを読み込み、表示させる方法をご紹介します。

「PHPExcel」のダウンロード

「PHPExcel」のダウンロードを行います。

以下へアクセスします。

【GitHub-PHPOffice / PHPExcel:アーカイブ済み】
https://github.com/PHPOffice/PHPExcel

ダウンロードしたZIPを解凍し、その中にある「Classes」フォルダを使用しますので、任意のディレクトリにコピーしてください。

「PHPExcel」の読み込み+ファイル準備

まず始めに、以下の2つを読み込みます。

include("ファイルパス/Classes/PHPExcel.php");
include("ファイルパス/Classes/PHPExcel/IOFactory.php");

Excelファイルの準備

次に、読み込むExcelファイルの準備です。

  • 表の構成パターンは、1行目に各項目2行目以降に行ごとでアイテム(内容)を想定しています。

Excelファイルの読み込み

ではExcelファイルの読み込みを行います。

$obj = PHPExcel_IOFactory::load("ファイルパス/data.xlsx");

Excelファイルの内容を配列に格納

読み込んだExcelファイルのデータを配列に格納します。

<?php
// データ格納用の配列の準備
$keyarray=array(); // 最初の行の項目の格納用
$dataarray=array(); // シート内のセルのデータの格納用
$titlearray=array(); // シートのデータの格納用
// データを配列に格納、シートの数だけループ処理を行う
for ($i = 0; $i < $obj->getSheetCount(); $i++) {
	// シートの情報を取得
    $sheet = $obj->setActiveSheetIndex($i);
	// シート内のセルの情報を取得
    $objactive = $obj->getActiveSheet();
	// シート内のセルの情報から、空のセルを除外
    $objarray = $objactive->toArray(null,true,true,true);
	// シート名の取得
    $sheetTitle = $objactive->getTitle();
	// シート名を配列に格納
    $titlearray[] = $sheetTitle;
	// シート内のセルの情報をループ処理
	foreach($objarray as $rowindex=>$rowdata){
		if($rowindex == '1'){
			//1行目にカラム名として連想配列のキーが入っている
			foreach($rowdata as $key=>$value){
				// 最初の行の項目の格納用配列に項目を格納
				$keyarray[$sheetTitle][$key]=nl2br($value);
			}
		} else {
			//2行目以降は、1行目で求めたカラム名を連想配列のキーとする
			foreach($rowdata as $key=>$value){
				// 最初の行の項目の格納用配列と連動させながらセル情報を格納
				$dataarray[$sheetTitle][$rowindex-1][$keyarray[$sheetTitle][$key]] = nl2br($value);
			}
		}
	}
}
?>

データ格納用の配列として、

  1. 項目情報用
  2. セル情報用
  3. シート情報用

の3つの配列を用意します。

データを格納していく流れ

シート情報を「for」で繰り返し処理

  • シート名をシート情報用の配列に格納

シート情報を元に、セル情報を「foreach」で繰り返し処理

  • 最初の行の場合(「if($rowindex == ‘1‘)」で判定)、項目情報用の配列に、各項目情報を格納
  • 2行目以降の場合は、項目情報用の配列の各値を連想配列のキーとして、セル情報用の配列に格納

データを格納し終えた3つの配列を使い、出力を行う。

格納した配列データを元に、出力を行います。

<?php
// シートのデータ配列が存在する+空でないならば
if(!empty($titlearray)):
// シートのカウント
$counter = 0;
// シートのループ処理開始
foreach($titlearray as $titlelabel):
// シートのラベル情報が存在する+空でないならば
if(!empty($catarray[$titlelabel])):
?>
<section id="row-num<?php echo $counter; ?>" class="section">
<h2 class="titles"><?php echo $titlelabel; ?></h2>
<?php 
// シート内セルの、行ごとのループ処理開始
foreach($dataarray[$titlelabel] as $row => $item):
?>
<div id="row<?php echo $item["id"]; ?>" class="section-s">
	<h3 class="subtitles"><?php echo $item["項目①"]; ?></h3>
	<dl class="dl-list clearfix">
		<dt>項目②</dt>
		<dd><?php echo $item["項目②"]; ?></dd>
		<dt>項目③</dt>
		<dd><?php echo $item["項目③"]; ?></dd>
		<dt>項目④</dt>
		<dd><?php echo $item["項目④"]; ?></dd>
		<dt>項目⑤</dt>
		<dd><?php echo $item["項目⑤"]; ?></dd>
	</dl>
</div>
<?php
// シート内の行ごとのループ処理終了
endforeach;
?>
</section>
<?php
// シートのカウント処理
$counter++;
endif;
endforeach; // シートのループ処理終了
endif;
?>

データを出力していく流れ

シート情報用の配列を「foreach」で繰り返し処理

シート情報の値を元に、セル情報を「foreach」で繰り返し処理

  • $item[‘各項目名’]として、項目の順番を気にせずに出力が可能なので、適宜好きな形にマークアップを行う。

ここに注意!

現在、PHPExcelは非推奨となっていますので、注意が必要です。
後継として知られている「PhpSpreadsheet」の使用が推奨されています。
https://github.com/PHPOffice/PhpSpreadsheet

こちらにも追々触れていこうと思います。

参考ページ

【PHPExcelでエクセル出力入門-Qiita】
https://qiita.com/suin/items/7a8d0979b7675d6fd05b

コメント

コメントを残す

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

1 + 16 =

「問題 × 解決策」
月別アーカイブ一覧

「問題 × 解決策」
月別アーカイブ一覧