プログラミング備忘録始めました。
前回の記事でご紹介させていただきましたが、当社では学会・シンポジウムの総合開催支援システム「CONFAID」を外注はせずに社内で開発しています。まだまだ未熟ですが、主催者様や参加者様のお声を伺い、より便利に使いやすくするため、毎年改良をしてきました。その過程で経験したプログラミング等の知識を備忘録として、残すことにしました。あくまで備忘録ですので、特別難しいことは書きません。プログラミング初心者の方や、「あれ、どうやってやるんだっけ?」みたいな、ちょっとした確認をしたい方のお役に立てれば、幸いです。
やりたいこと
PHPでテンプレートとなるExcelファイルを読み込み、データを追加して一覧表を作成する。
今回はイベントの参加登録者をリスト形式でExcel出力する想定でプログラムを作成します。 下記のようなテンプレートファイルを準備します。
最終的に下記のようなExcelファイルが出力されることを目指します。
PhpSpreadsheet
PHPでExcelを扱うためにPhpSpreadSheetというライブラリを使用します。PhpExcelというライブラリの後継となります。以前は私もPhpExcelを使用していましたが、使い方はあまり変わりません。
実装方法
動作環境
動作環境は下記の通りです。
- Windows10
- PHP 7.4.11
- phpoffice/phpspreadsheet 1.21
PhpSpreadsheetのインストール
composerでPhpSpreadsheetをインストールします。
composer require phpoffice/phpspreadsheet
テンプレートの読み込み
予め準備したテンプレートファイルを読み込み、対象のシートを選択します。
// テンプレートファイルパス
$templatePath = "template.xlsx";
// テンプレートファイル読み込み
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load($templatePath);
// 対象のシート選択
$sheet = $spreadsheet->getSheetByName('List');
セルの書式コピー
一覧表にするため、データ数に伴い行を追加していきます。罫線や書式を毎回設定すると、ソースコードが増えてしまうため、テンプレートの2行目のA列のセル書式をコピーします。
// テンプレートファイルパス
$templatePath = "template.xlsx";
// テンプレートファイル読み込み
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load($templatePath);
// 対象のシート選択
$sheet = $spreadsheet->getSheetByName('List');
// セル書式のコピー
$style = $sheet->getStyle('A2');
セルにテキストを入力
テスト用のデータを配列で準備し、1行ずつデータを出力します。各セルを指定して、セル書式のペーストおよびテキストの出力をします。
$participantsList = [
['name' => '久遠 太郎', 'type' => '一般登録', 'fee' => 50000],
['name' => '久遠 花子', 'type' => '学生登録', 'fee' => 25000],
['name' => '会議 太郎', 'type' => '一般登録', 'fee' => 50000],
['name' => '学会 一郎', 'type' => '一般登録', 'fee' => 50000],
];
$num = 1; // 行番号
$row = 2; // 行ポインター
foreach($participantsList as $participant) {
// +++ 行番号 +++
$sheet->duplicateStyle($style, 'A' . $row); // セル書式のペースト
$sheet->setCellValue('A' . $row, $num); // テキストの出力
// +++ 氏名 +++
$sheet->duplicateStyle($style, 'B' . $row); // セル書式のペースト
$sheet->setCellValue('B' . $row, $participant['name']); // テキストの出力
// +++ 登録タイプ +++
$sheet->duplicateStyle($style, 'C' . $row); // セル書式のペースト
$sheet->setCellValue('C' . $row, $participant['type']); // テキストの出力
// +++ 参加費 +++
$sheet->duplicateStyle($style, 'D' . $row); // セル書式のペースト
$sheet->setCellValue('D' . $row, number_format($participant['fee'])); // テキストの出力
$num++;
$row++;
}
Excelファイル書き出し
最後に出力ファイルパスを定義し、Excelファイルを出力します。
// 出力ファイルパス
$outputPath = "output.xlsx";
// ファイル出力
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save($outputPath);
以下のような一覧表ができました。
まとめ
今回は予めテンプレートを準備して、ソースコードが最小限になるようにセル書式は書式コピーで対応しました。もちろん、ゼロからExcelファイルを作成できます。セル書式に関しても指定できますので、詳細は公式ドキュメントでご確認ください。