【PHPで表操作】PhpSpreadsheetライブラリを使って、エクセル風の表を出力したり、webページに埋め込んだりしてみる
| 更新: 2024/08/04 | 3234文字
今回は、PHPライブラリを使った、エクセル風の表出力やwebページ埋め込みのしかたを取り上げます。埋め込みとかはサイト制作などでも使いそうな気がします。さっそく、ライブラリのインストール方法や、使用する内部のメソッドなどをみていきましょう。
目次
PhpSpreadsheetとは?
かんたんな概要や公式ドキュメント
PHPでエクセルやスプレッドシート的な表を操作するためのライブラリです。今回使ったように、セルに値を割り当てていって表をファイルとして出力したり、サイトに埋め込んだりできます。
また、公式ドキュメントを読んでみた感じだと、出力関連メソッドのほか『Reader/〇〇(Xlsxとか拡張子名)』のような読み込みメソッドもあります。
■PhpSpreadsheet githubリポジトリ
https://github.com/PHPOffice/PhpSpreadsheet
■PhpSpreadsheet公式ドキュメント
https://phpspreadsheet.readthedocs.io/en/latest/
インストール方法(composer有のxampp環境)
このライブラリもよくあるパターンで、『composer(パッケージ管理)が入っている環境の場合は、任意のパスを指定してコマンドでインストール』という流れでインストールできます。composer入れ方は省きますが、phpspreadsheetは以下のコマンドで入れました。
composer require phpoffice/phpspreadsheet
xampp/htdocs/study/以下に『2024-08-spredsheet』というフォルダを作っておいたので、そこを指定した後、composer requireコマンドで入れます。 コマンドプロンプトがこんな感じの表示になればインストールできた形になります。
インストールフォルダに移動してみたところ。vendorやcomposer.jsonが入ってきましたね。ぶんしょやreadtestは管理人が作ったファイルです。あと、読み込みじゃなくて生成しているのに、フォルダ名がreadtestって間違ってますのでご了承ください。
例1~表を生成して、webページに埋め込む
というわけで、webページ埋め込みとcsvファイル出力を行ってみます。表の内容は適当に、管理人がプレイしているゲームのキャラクター能力値をまとめたものをつくってみました。 なお、『localhost/study/2024-08-spredsheet/readtest/index.php』で生成・表示する形で作りました。アプリケーション状況によってビューとコントローラーみたいに分離してもベターです。
コードやポイント
必要ファイルはライブラリに入っているautoload.phpで読み込みます(パスはインストール環境によって変えてください)。ポイントはそのあとのuseを使った必要クラスのロードで、『埋め込み時はWriter\Html』『ファイル保存時はWriter\Ods(odsでもcsvは出た)』のようにロードしておかないと動きません。コードは以下のような感じで。
use PhpOffice\PhpSpreadsheet\Writer\Html;
use PhpOffice\PhpSpreadsheet\Writer\Ods;
$sheet_inst = new Spreadsheet();
$sheet = $sheet_inst->getActiveSheet();
そして、座標指定&値のセットを行い、new Htmlでインスタンス化します。
~以下略~
$writer = new Html($sheet_inst);
この段階では表がまだ出力されていないので、htmlの表示したい部分で『echo $writer->generateSheetData();』のようにして出力します。(*html部分は省略しています)
表示例
ローカル環境で作っていたので、xamppをオンにしてブラウザでアクセス・実行したところ、こんな感じで表がhtmlに埋め込まれて表示されました。
表の中身はサガスカのキャラと能力なんですけど、管理人がプレイして装備とかで補正をかけた状態になっています。なので攻略サイトなどで紹介されている内容とは異なりますのでご了承ください。
例2~csv拡張子で保存して、エクセルやopenoffice calcで開けるようにする
コード例
ファイルとして出力する場合は、違うクラスやメソッドがあります。なお、上の段落で、既に『use PhpOffice\PhpSpreadsheet\Writer\Ods;』で使えるようにしてあるので、あとはインスタンスです。htmlのときと違ってnew Odsでインスタンスにします。そしてセーブ(保存パスはここで指定します、この場合はプログラムと同じ階層に出ます)。
$sheet->setCellValue(‘H5′, ’12’);
~以下略~
$output_csv = new Ods($sheet_inst);
$output_csv->save(‘sampleSheet.csv’);
生成されたファイル
実行後、こんな感じでcsvファイルができました。
openoffice calcで開いたところ。内容も設定した通りcsvファイルになって
すでに生成されている場合のエラーについて
ファイル保存について。表がすでに生成された状態で、もう一度ブラウザ表示させようとしたところ、『could not open file』が出ます。すでにフォルダ内にファイルがあるか判定して、ファイルが無い場合は新規に生成・ある場合はそのファイルをロードしてから編集する、といったような対応になります。
また、アプリケーションによっては『一時ファイルとして生成し、ブラウザでダウンロードしてもらった後はフォルダ保存しない』なども考えられます。
あとがき・まとめ
- PhpSpreadsheetライブラリで、エクセル的な表の生成やwebページへの埋め込みができる
- インストールはよくある、composer入れた後パス指定して、コマンドでインストール
- webページに埋め込み、csv拡張子で保存など、用途に応じたメソッドがあるので、対応したクラスをロードしておく
- 上記のように簡単に書いた場合は、既にある状態で生成しようとするとエラーになったので、アプリケーションに応じた対応をする
まとめると、こんなところでしょうか。今度は表をロードしてその内容をサイトに反映させる、みたいなのもやってみたいですね。