はじめに
テスト時の作業としてプログラム実行前と実行後のスクリーンショットを貼り付けてエビデンス資料を作成する作業をしていたことがあります。
作業時はスクリーンショットを都度撮り、あとでスクリーンショットを1枚ずつExcelの挿入機能で貼り付けるといった流れで行っていました。
手作業で漏れが発生したり、単純に量が多いと時間がかかるので、これを自動化するpowershellスクリプトを作成していました。
今回はphpの勉強も兼ねて、powershellでなくphpでExcelに画像フォルダ内の画像を順番に貼り付けるプログラムを組んでみました。
プログラムの概要
PhpSpreadsheetという、PhpExcelライブラリの後継となるものを使用してエクセルの操作を行います。
・フォルダに格納された画像を読み込み、サイズを取得して貼り付け
・次の貼り付けセルを設定(前の貼り付けた画像のサイズから計算)
・全て貼り付けたらエクセルを保存
事前準備
composerのインストール(macOS)
brew install composer
phpspreadsheetのインストール
composer require phpoffice/phpspreadsheet
GDとZip拡張のインストール
brew install php@8.2-gd php@8.2-zip
貼り付ける画像フォルダを準備
貼り付け先エクセルを準備(中身は空)
ソースコード
<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
// 貼り付ける画像フォルダのフルパスを指定
$folderPath = "/images";
// 貼り付けるExcelのフルパスを指定
$outputFilePath = "/エビデンス.xlsx";
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$images = glob($folderPath . "/*.{jpg,jpeg,png,gif}", GLOB_BRACE);
$row = 1;
foreach ($images as $imagePath) {
list($width, $height) = getimagesize($imagePath);
$drawing = new Drawing();
$drawing->setName('Image');
$drawing->setDescription('Image inserted from ' . $imagePath);
$drawing->setPath($imagePath);
$drawing->setHeight($height);
$drawing->setWidth($width);
$drawing->setCoordinates('A' . $row);
$drawing->setWorksheet($sheet);
// 次の画像を貼り付ける行を取得
$row += ceil($height / 20) + 1;
}
$writer = new Xlsx($spreadsheet);
$writer->save($outputFilePath);
echo "Excelに画像を貼り付けました: $outputFilePath\n";
まとめ
単純なプログラムではありますが、PhpSpreadsheetを使ったエクセルの操作に一通り触れることができました。
画像サイズに応じて次の画像の貼り付け位置を変えるようにしていますが、画像サイズがバラバラのときエビデンスとしては見にくい資料となってしまうので、リサイズ等の処理を入れるなど改善してみたいなと思います。
参考
PhpSpreadsheet
PhpSpreadsheetでExcelを読み書きしてExcelとしてダウンロードする
PhpSpreadsheetのTIPSあれこれ