プログラミングのゴミ箱

日々の学習の中で知らなかったことについて、調べたことを解説します。

サンプルプログラムで学ぶPHPでExcel操作(初心者向け) 前編

目的

PhpSpreadsheetを使ってPHPExcelを操作する方法をゴリラでもわかるようにサンプルプログラムを作りながら解説。
f:id:chanichiwasshoi:20220101134302p:plain
f:id:chanichiwasshoi:20220101134605p:plain

こんな感じのアプリができます。

PhpSpreadsheetって?

Phpを使ってExcelを操作するためのライブラリです。
大昔にPHPExcelというライブラリも存在したらしいんですけど、今完全にPhpSpreadsheetに移り変わっています。
github.com

公式もPHPSpreadsheetを使うように言ってます。

環境構築

まずはPHPSpreadsheetを環境に追加します。
PHPで環境構築をするときにはcomposerというものを使います。JavaScriptで言うところのnpmです。
composerのインストール方法についてはこちらを参照しました。
www.webdesignleaves.com

composerがインストールできたら、PHPSpreadsheetを使いたいフォルダの下に移動して、以下のコマンドを実行します。
Welcome to PhpSpreadsheet's documentation - PhpSpreadsheet Documentation

mkdir PHPサンプルフォーム
cd PHPサンプルフォーム
composer require phpoffice/phpspreadsheet

PHPSpreadsheetのインストールが完了しました!!
プログラムを作っていきましょう!

Excelファイルの読み込み

まずはExcelファイルを読み込んでいきます。
 今回使用プログラムはgithub上に公開していますので、Excelファイルを使用する場合はこちらからダウンロードしてください。
GitHub - trmti/PHP-Sample-form: PHPを用いたExcel操作のサンプルプログラム
大したことは書いてないのでExcelファイルは自作してもらって全然構いません笑。

Excelを読み込むために以下のようなプログラムを作ります。

require 'vendor/autoload.php'; // ライブラリの読み込み

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
$inputFileName = "./SampleForm.xlsx";
$reader = new XlsxReader();
$spreadsheet = $reader->load($inputFileName);
$sheet = $spreadsheet->getSheet(0);
echo $sheet->getCell("C3")->getValue(); // 176

プログラムの解説をします。
 まず一行目のrequireの場所ではcomposerを使ってインストールしたライブラリをすべて読みこんで使えるようにしています。ここは定型文なのでふーんくらいに思っていてください。詳しく知りたい方を以下のサイトなどを参照したらいいと思います。
これで理解できるPHPのComposerを使ったオートロード | アールエフェクト

 次のuseのところでは実際にどのライブラリを使うのかnamespaceを使って指定しています。namespaceはこのサイトがわかりやすいです。
【PHP超入門】名前空間(namespace・use)について - Qiita
 簡単に言うと、いろんなプログラムを読み込んでしまうと関数名がかぶったりごちゃごちゃしたりしてわかりにくくなってしまうから、フォルダ分けするように関数やクラスにパスを付けましょうみたいなことです。
asをつけることでそのパスを変数に代入して使えます。

 ここで注意してほしいのが、読み込むファイルがxlsxファイルの場合はこのままで大丈夫ですが、xlsファイルの場合パスを
PhpOffice\PhpSpreadsheet\Reader\Xls
に変更してください。僕はこれに気がつくのに1時間かかりました笑。

 あとは$spreadsheetでExcelファイルを読み込み、$sheetでどのシートからデータを取るかを選択し、シートのC3の値を出力しています。

関数化

次にこのプログラムを関数化して使いやすくします。readExcel.phpというファイルを作って以下のようなプログラムを書いてください。

<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;

function getData(
  $data_range,
  $sheetNum = 0,
  $inputFileName = "./SampleForm.xlsx",
) {
  $reader = new XlsxReader();
  $spreadsheet = $reader->load($inputFileName);
  $sheet = $spreadsheet->getSheet($sheetNum);
  $dataArray = $sheet->rangeToArray(
    $data_range,
    NULL, // からのセルにNULLを代入
    TRUE, // 値を計算してから返すかどうか ex.2*A3を計算するかそのまま返すか
    TRUE, // 値をフォーマットして返すか(ここはよくわからんかった)
    TRUE, // 配列にインデックス名を与えて返すか
  );
  return $dataArray;
}
?>

さっきのプログラムとの変更点は単一のデータを返すのではなく、二次元配列のデータを返しているところです。
例えば、$data_rangeに"A3:D8"という値を与えると、A3からD8までの範囲のデータを取得し、$data["A"][4]というようにアクセスできます。

これでPHPからExcelの値を取得できるようになりました。