CakePHP1.3.6:PHPExcelをつかってみる(簡単なコントローラーを作成する編)。

2009年のマイコミジャーナルの記事を参考にすれば、とっても簡単にExcelを動的に生成して、ダウンロードさせることができる。

Excel2007形式でダウンロード

以下のようなフォーマット(見出しとシート名)をテンプレートとしてよみこんで、簡単な見積書のダウンロードを作ってみる。

コントローラーは以下。上のテンプレートを、webroot/tmp/template.xslxとして保管してある。

<?php
require_once '../vendors/phpexcel/phpexcel.php';

class ExcelSamplesController extends AppController{
	public $name = 'ExcelSamples';
	public $uses = array();
	
	/**
	 * 
	 * 初期画面(一覧表示)
	 */
	function index(){
		$this->autoRender = false;     // Viewを使わない
		Configure::write('debug', 0);  // debugコードを出さない
		
		//Templateを読み込んで、PHPExcelオブジェクトを生成する
		$reader = PHPExcel_IOFactory::createReader('Excel2007');
		$xl = $reader->load('tmp/template.xlsx');

		//シートの設定
		$xl->setActiveSheetIndex(0);
		$sheet = $xl->getActiveSheet();

		//セルの値を設定
		$sheet->setCellValue('b3', '山川商事株式会社様');
		$sheet->setCellValue('b4', '東京都品川区xxx町xxx-xxx');
		$sheet->setCellValue('c8', 'パソコン一式');
		$sheet->setCellValue('e8', 10000);

		//スタイルの設定(標準フォント、罫線、中央揃え)
		$sheet->getDefaultStyle()->getFont()->setName('MS Pゴシック');
		$sheet->getDefaultStyle()->getFont()->setSize(11);
		$sheet->getStyle('b3')->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

		//Excel2007形式で保存
		$writer = PHPExcel_IOFactory::createWriter($xl, 'Excel2007');
		$writer->save("tmp/output.xlsx");
		
/*
 * 2007形式でダウンロード
 */		
		header ("Content-disposition: attachment; filename=output.xlsx");
		header ("Content-type: application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name=output.xlsx");
		
		$out = file_get_contents("tmp/output.xlsx");
		return($out);

	}
	
}
?>

これで、ExcelSamplesにアクセスすると以下のようにダウンロードが開始される。

中身は以下。

Excel95-2003形式でダウンロード

Excel95-2003形式でダウンロードするには、以下。テンプレートを95-2003形式で作成しておく。

<?php
require_once '../vendors/phpexcel/phpexcel.php';

class ExcelSamplesController extends AppController{
	public $name = 'ExcelSamples';
	public $uses = array();
	
	/**
	 * 
	 * 初期画面(一覧表示)
	 */
	function index(){
		$this->autoRender = false;    // Viewを使わない
		Configure::write('debug', 0); // debugコードを出さない
		
		//Templateを読み込んで、PHPExcelオブジェクトの生成
		$reader = PHPExcel_IOFactory::createReader('Excel5');
		$xl = $reader->load('tmp/template.xls');

		//シートの設定
		$xl->setActiveSheetIndex(0);
		$sheet = $xl->getActiveSheet();

		//セルの値を設定
		$sheet->setCellValue('b3', '山川商事株式会社様');
		$sheet->setCellValue('b4', '東京都品川区xxx町xxx-xxx');
		$sheet->setCellValue('c8', 'パソコン一式');
		$sheet->setCellValue('e8', 10000);

		//スタイルの設定(標準フォント、罫線、中央揃え)
		$sheet->getDefaultStyle()->getFont()->setName('MS Pゴシック');
		$sheet->getDefaultStyle()->getFont()->setSize(11);
		$sheet->getStyle('b3')->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

		//Excel95形式で保存
		$writer = PHPExcel_IOFactory::createWriter($xl, 'Excel5');
		$writer->save("tmp/output.xls");
		

/*
 * 95-2003形式でダウンロード
 */		
		header ("Content-disposition: attachment; filename=output.xls");
		header ("Content-type: application/octet-stream; name=output.xls");
		
		$out = file_get_contents("tmp/output.xls");
		return($out);
		
	}
	
}
?>

試しにPDF形式でダウンロード

PDF形式でダウンロードするには、以下。

<?php
require_once '../vendors/phpexcel/phpexcel.php';

class ExcelSamplesController extends AppController{
	public $name = 'ExcelSamples';
	public $uses = array();
	
	/**
	 * 
	 * 初期画面(一覧表示)
	 */
	function index(){
		$this->autoRender = false;    // Viewを使わない
		Configure::write('debug', 0); // debugコードを出さない
		
		//Templateを読み込んで、PHPExcelオブジェクトの生成
		$reader = PHPExcel_IOFactory::createReader('Excel2007');
		$xl = $reader->load('tmp/template.xlsx');

		//シートの設定
		$xl->setActiveSheetIndex(0);
		$sheet = $xl->getActiveSheet();

		//セルの値を設定
		$sheet->setCellValue('b3', '山川商事株式会社様');
		$sheet->setCellValue('b4', '東京都品川区xxx町xxx-xxx');
		$sheet->setCellValue('c8', 'パソコン一式');
		$sheet->setCellValue('e8', 10000);

		//スタイルの設定(標準フォント、罫線、中央揃え)
		$sheet->getDefaultStyle()->getFont()->setName('MS Pゴシック');
		$sheet->getDefaultStyle()->getFont()->setSize(11);
		$sheet->getStyle('b3')->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

		//pdf形式で保存
		$writer = PHPExcel_IOFactory::createWriter($xl, 'PDF');
		$writer->setFont('arialunicid0-japanese');
		$writer->save("tmp/output.pdf");
		

/*
 * pdf形式でダウンロード
 */		
		header ("Content-disposition: attachment; filename=output.pdf");
		header ("Content-type: application/pdf; name=output.pdf");

		$out = file_get_contents("tmp/output.pdf");
		return($out);
		
	}
	
}
?>

ただし、この場合、以下のようなPDFになってしまう。これはちょっと使えない。方法はあるんでしょうね。