PHPExcelを使ってExcelシートに画像を貼りつけてみた

Facebooktwitter

ウェブサーバ上で、アップロードされた画像をMS Excelに張り付け、そのファイルをダウンロードするシステムの見積依頼が来たので、下調べにプロトタイプを作ってみました。
PHPExcelを使えば出来そうなんですが、なかなかネット上に情報がなく、仕方ないので、PHPExcelに添付のドキュメントを読むことに。意外と丁寧に書かれてあって、わかりにくそうな機能にはちゃんとサンプルコードも添えられており、あっさり動いてくれました。
これはその時の備忘録。
【準備するもの】

  • PHPExcel(http://phpexcel.codeplex.com/からダウンロード)
  • PHP5.2以上
  • php_zip (.xlsx, .odsファイルを扱わない場合は不要)
  • php_xml
  • php_gd2

*サーバはアイルの+Infinito Plusにしました。何も追加することなく動きます。
【手順】

  1. PHPExcelオブジェクトを生成する。このオブジェクトがひとつのExcelファイルになるという概念です。この中にワークシート、セル、データ、計算式、画像オブジェクトが含まれ、すべてはメモリ上で操作されるということです。
  2. 既存のExcelファイルをオープンする。
  3. 画像を扱うオブジェクトを生成する。
  4. 画像オブジェクトにサーバ上に置いてある画像をロードする。
  5. 画像オブジェクトをExcelオブジェクトのワークシートにセットする。
  6. Excelファイルの書き出し。

具体的にはこんな感じになります。

/** PHPExcelを読み込み*/
require_once '../Classes/PHPExcel.php';
/** PHPExcel_IOFactory 出力用のphpを読み込み*/
require_once '../Classes/PHPExcel/IOFactory.php';
// PHPExcelオブジェクトを生成
$objPHPExcel = new PHPExcel();
// テンプレートをオープン
$objReader = PHPExcel_IOFactory::createReader('Excel2007');///.xlsの場合は()ないにExcel5を
$objPHPExcel = $objReader->load("templates/test_template.xlsx");///これが実際のファイル名
$objPHPExcel->setActiveSheetIndex(0);////シートの1番目に移動
///画像用のオプジェクト作成
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setPath('./images/Sasaki20Nozomi_03.jpg');///貼り付ける画像のパスを指定
$objDrawing->setHeight(210);////画像の高さを指定
///画像のプロパティを見たときに表示される情報を設定
$objDrawing->setName('Nozomi Sasaki');////ファイル名
$objDrawing->setDescription('Nozomi Sasak');////画像の概要
$objDrawing->setCoordinates('B14');///位置
$objDrawing->setOffsetX(50);////横方向へ何ピクセルずらすかを指定
//$objDrawing->setRotation(25);//回転の角度
$objDrawing->getShadow()->setVisible(true);////ドロップシャドウをつけるかどうか。
///PHPExcelオブジェクトに張り込み
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
// エクセルファイルをブラウザに書き出し
//ヘッダーの設定
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="image_test.xlsx"');
header('Cache-Control: max-age=0');
//出力
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;

$objReader = PHPExcel_IOFactory::createReader(‘Excel2007’);


$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel2007’);
のExcel2007をExcel5にし、入出力ファイルの拡張子を.xlsにすればOffice2000のExcelファイルも扱えました。
以上です。