PhpSpreadsheetでフォーマット用のエクセルを読み込み、指定したセルにデータを書き込んだ上で別名で保存する方法
PHPで納品書等のフォーマット用のExcelを読み込み、指定したセルにデータを書き込んだ上で別ファイル名としてサーバに保存させたい。調べてみたところ以前にちょっとだけ触ったPhpSpreadsheetというライブラリで容易に実装できる模様。以下に実装方法をメモ。
目次
PhpSpreadsheetについて
公式サイト
https://phpspreadsheet.readthedocs.io/en/latest/
インストール方法
サーバにSSH接続し以下の手順でインストールする。
#インストールしたいディレクトリに移動 cd /aaa/bbb/ccc/phpspreadsheet #PhpSpreadsheetのインストール composer require phpoffice/phpspreadsheet #(必要に応じて)パーミッションと所有者・グループの変更 chown -R testuser:testuser /aaa/bbb/ccc/phpspreadsheet chmod -R 755 /aaa/bbb/ccc/phpspreadsheet
フォーマット用エクセルについて
テスト用としてこちらのサイトのエクセルシートをダウンロードしformat.xlsxにリネームしてサーバにアップロードした。
ちなみに以下のような内容になっており「数量」を入れると「金額・小計・消費税・合計」が計算され表示されるというもの。
今回はテストとして「概要」「数量」を2つずつ記入してみたい。
PHP側
ソースコード
<?php require 'vendor/autoload.php'; //フォーマット用のエクセル $format_file = 'format.xlsx'; //新しく作成するエクセル $new_file = date('YmdHis') . '.xlsx'; //【セル番号 : 内容】になるよう配列を作成 $data_list = array( 'A15' => '商品名1', 'D15' => '1', 'A16' => '商品名2', 'D16' => '3', ); //フォーマット用のエクセルの読み込み $format_sheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($format_file); //選択されているシートを取得 $work_sheet = $format_sheet->getActiveSheet(); //データを書き込み foreach( $data_list as $cell => $content ){ $work_sheet->getCell($cell)->setValue($content); } //別名でファイルを保存 $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($format_sheet, 'Xlsx'); $writer->save($new_file);
上記プログラムを実行すると以下内容のファイルが生成された。
「金額・小計・消費税・合計」の計算部分も正常に反映されている。
シートを指定したい場合
フォーマット用エクセル内にシートが3つあり、3つ目のシートにデータを記入したいというケースの場合は以下部分を書き換える。
//選択されているシートを取得 //$work_sheet = $format_sheet->getActiveSheet(); //シートを指定する場合 $work_sheet = $format_sheet->getSheet(2);
getSheet()の引数にシート番号を入れる。「0」から始まるため今回の場合は引数は「2」になる。
「Warning: fopen(xxxxxxxxxxx.xlsx): failed to open stream: Permission denied in」エラーが出る場合
ディレクトリのパーミッションを「775」もしくは「777」に変更すること。
所感
セル番号を指定してデータを書き込めるというのが直感的に分かりやすく、思ったよりも容易に実装できた。
あとはできればPhpSpreadsheetのインストールをcomposer無しで行いたかったんだけど方法が見つからなかった。
関連記事
-
PHPでユーザID毎にディレクトリを作成しキャッシュファイルを格納する方法
PHPで作ったプログラム内にてユーザーID毎に特定のディレクトリを作成し、その中 ...
-
メールサーバーを構築せずにGmailのSMPTを使ってPHPでメール送信
メールサーバーが立てられなかったり、無料サーバーのため使えなかったりといった場合 ...
-
セレクトメニューとテキストエリアの連動
やりたかった事は、 ・セレクトメニューで何れかを選択すると連動したテキストエリア ...
-
PHPでパスワードを保存する際に暗号(パスワードハッシュ)化させ、ログイン認証時に用いる方法
PHPでログイン認証を組み込む際に今までは特に暗号化は行っていなかった。と言うの ...
-
PHPでjpg / png画像をWebP画像に変換し保存する方法
PHPでjpg / png画像を圧縮したかった。ただjpg / pngのままだと ...