これで解決!PhpSpreadsheetに画像を簡単に挿入する方法
ExcelファイルをPHPで操作できる便利なライブラリ「PhpSpreadsheet」。
使いこなすととても強力なのですが、画像の挿入方法については公式ドキュメントもやや分かりにくく、手間取ってしまうことが多いです。
この記事では、そんなPhpSpreadsheetで画像を簡単に挿入する方法をわかりやすくまとめました!
また、Laravelプロジェクトでの実装方法についても具体例を交えて解説しますので、Laravelユーザーも安心してください。
「画像を貼りたいけど、どうやるの?」「サンプルコードが欲しい!」という方は、ぜひ参考にしてみてくださいね!
PhpSpreadsheetとは?
PhpSpreadsheetは、PHPでExcelファイル(.xlsx、.xls)やスプレッドシートを作成・編集・出力できるライブラリです。
Microsoft Office Excelに依存せず、サーバーサイドで自在にスプレッドシートを操作できるため、レポート生成やデータ管理システムなどで幅広く使われています。
特に、
- セルへのデータ入力
- スタイル(フォント、色など)の設定
- 複数シートの操作
- グラフや画像の挿入
といった高度な操作もサポートしているため、実務レベルでも非常に重宝されています。
この記事では、このPhpSpreadsheetを使った**「画像挿入」**にフォーカスして解説していきます!
画像を挿入する基本手順
まずは、PhpSpreadsheetを使って画像を挿入するための基本的な手順を紹介します!
必要な準備
PhpSpreadsheetをまだインストールしていない場合は、Composerでインストールしておきましょう。
composer require phpoffice/phpspreadsheet
また、画像ファイル(JPEG、PNGなど)を用意しておきます。
基本的なコード例
以下のコードは、Excelファイルに画像を貼り付ける最もシンプルな例です。
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
// 新しいスプレッドシートを作成
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Drawing(描画オブジェクト)を作成
$drawing = new Drawing();
$drawing->setName('Sample Image');
$drawing->setDescription('Sample Image');
$drawing->setPath('path/to/your/image.png'); // 画像のパスを指定
$drawing->setCoordinates('B2'); // 画像を配置するセル
$drawing->setWorksheet($sheet);
// ファイルとして保存
$writer = new Xlsx($spreadsheet);
$writer->save('sample_with_image.xlsx');
ポイント
setPath()
に正しい画像ファイルのパスを指定することsetCoordinates()
で画像を表示したいセル位置を指定できることDrawing
クラスを使って画像をスプレッドシートに関連付けること
これだけで、画像を簡単にExcelに挿入することができます!
LaravelでPhpSpreadsheetを使う方法
LaravelプロジェクトでPhpSpreadsheetを使って画像を挿入する場合も、基本的な流れはPHP単体と同じです。
ただし、Laravelのファイルシステム(Storage)やディレクトリ構成に注意が必要です。
インストール手順
LaravelプロジェクトにPhpSpreadsheetを導入するには、Composerでインストールします。
composer require phpoffice/phpspreadsheet
すでにインストール済みなら、この手順は飛ばしてOKです!
サンプルコントローラーの作成
コマンドでコントローラーを作成します。
php artisan make:controller ExportController
そして、作成したコントローラーに以下のコードを追加します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use Storage;
class ExportController extends Controller
{
public function exportWithImage()
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$drawing = new Drawing();
$drawing->setName('Laravel Image');
$drawing->setDescription('An image from Laravel project');
$drawing->setPath(storage_path('app/public/sample_image.png')); // Storage内の画像を指定
$drawing->setCoordinates('C3');
$drawing->setWorksheet($sheet);
$writer = new Xlsx($spreadsheet);
$filePath = storage_path('app/public/sample_with_image.xlsx');
$writer->save($filePath);
return response()->download($filePath)->deleteFileAfterSend(true);
}
}
注意ポイント
- 画像ファイルは、
storage/app/public/
ディレクトリなど、サーバー上からアクセス可能な場所に置くようにしましょう。 storage:link
コマンドで、ストレージと公開ディレクトリをリンクしておく必要がある場合もあります。
php artisan storage:link
この流れで、Laravelから画像付きのExcelファイルをダウンロードできるようになります!
ハマりやすいポイントと対策
PhpSpreadsheetで画像を挿入する際、よくあるつまずきポイントとその対策方法をまとめました!
あらかじめ知っておくと、トラブルを防ぎやすくなります!
① パスの指定ミス
問題:
画像ファイルのパスが間違っていると、「ファイルが存在しない」というエラーになります。
対策:
- PHPの
__DIR__
やstorage_path()
などを使って、絶対パスで指定すると安全です。 - Laravelの場合、
storage/app/public
内に置いたファイルは、storage_path('app/public/ファイル名')
でアクセスできます。
② 画像サイズ調整
問題:
画像がセルを飛び出してしまったり、大きすぎて見づらくなることがあります。
対策:Drawing
クラスの以下のメソッドを使ってサイズを調整しましょう!
$drawing->setHeight(80); // 高さを80pxに設定
$drawing->setWidth(150); // 幅を150pxに設定
※ 縦横どちらか一方だけ設定すると、比率が自動調整されます。
③ 画像の位置(セル座標)
問題:
画像が意図した位置に表示されないことがあります。
対策:
setCoordinates('B2')
のように、正確なセル番地を指定しましょう。- 必要なら、微調整も可能です(
setOffsetX()
,setOffsetY()
を使用)。
$drawing->setOffsetX(10); // 水平方向に10px移動
$drawing->setOffsetY(5); // 垂直方向に5px移動
細かい位置調整を加えることで、より自然なレイアウトに仕上がります!
まとめ
今回は、PhpSpreadsheetを使ってExcelファイルに画像を簡単に挿入する方法を解説しました。
また、Laravelプロジェクトで実際に組み込む方法や、ハマりやすいポイントについてもご紹介しました。
この記事で押さえたポイントは、
- 画像の基本挿入手順
- Laravelプロジェクトでの実装方法
- パス指定、サイズ調整、位置微調整のコツ
などです!
PhpSpreadsheetは慣れてしまえば、データと一緒に画像を自在に操作できる強力なツールです。
ぜひ今回の内容を活用して、よりリッチなスプレッドシート作成にチャレンジしてみてください!
もしさらにレベルアップしたい場合は、複数画像の挿入や、動的に画像を変える処理にも挑戦してみると面白いですよ!