問題
解決策
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);
}
}
}
}
?>
データ格納用の配列として、
- 項目情報用
- セル情報用
- シート情報用
の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
コメント