ウェブサーバ上で、アップロードされた画像をMS Excelに張り付け、そのファイルをダウンロードするシステムの見積依頼が来たので、下調べにプロトタイプを作ってみました。
PHPExcelを使えば出来そうなんですが、なかなかネット上に情報がなく、仕方ないので、PHPExcelに添付のドキュメントを読むことに。意外と丁寧に書かれてあって、わかりにくそうな機能にはちゃんとサンプルコードも添えられており、あっさり動いてくれました。
これはその時の備忘録。
【準備するもの】
- PHPExcel(http://phpexcel.codeplex.com/からダウンロード)
- PHP5.2以上
- php_zip (.xlsx, .odsファイルを扱わない場合は不要)
- php_xml
- php_gd2
*サーバはアイルの+Infinito Plusにしました。何も追加することなく動きます。
【手順】
- PHPExcelオブジェクトを生成する。このオブジェクトがひとつのExcelファイルになるという概念です。この中にワークシート、セル、データ、計算式、画像オブジェクトが含まれ、すべてはメモリ上で操作されるということです。
- 既存のExcelファイルをオープンする。
- 画像を扱うオブジェクトを生成する。
- 画像オブジェクトにサーバ上に置いてある画像をロードする。
- 画像オブジェクトをExcelオブジェクトのワークシートにセットする。
- 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ファイルも扱えました。
以上です。