PhpSpreadsheetを使ってExcelを読み書きし、一覧表を作成する。~プログラミング備忘録〜

プログラミング

プログラミング備忘録始めました。

前回の記事でご紹介させていただきましたが、当社では学会・シンポジウムの総合開催支援システム「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ファイルを作成できます。セル書式に関しても指定できますので、詳細は公式ドキュメントでご確認ください。

Documentation