複数シートを対象にEXCEL出力したい場合の参考になれば幸いです。たとえばですが、下記ソースで、ベースとなる何も記入していないEXCELファイル(test_base.xlsx)を読込、請求書(定型フォーマット)、請求明細書(定型フォーマット)、請求書控え(定型フォーマット)各3シートのEXCELファイル(test3sheet.xlsx)を1つ読み込み、それぞれのシートを1つずつコピーして、値を出力(例:A2にtest1から3を出力)して、一番最初に読み込んだシートを削除するのを、サンプルとして記載しました。
このプログラムを動作させた環境は、phpexcel 1.8.0 cakephp 2.6.7です。
// Excel2007用ライブラリ require_once(APP. 'Vendor/phpexcel/PHPExcel/IOFactory.php'); require_once(APP. 'Vendor/phpexcel/PHPExcel/Writer/Excel2007.php'); require_once(APP. 'Vendor/phpexcel/PHPExcel/Reader/Excel2007.php'); Configure::write('debug', 0); // debugコードを非表示 $filename = "test_base.xlsx"; $load_path = APP . '/Vendor/phpexcel/parts/'. $filename; $filename = "test3sheet.xlsx"; $load_add_path = APP . '/Vendor/phpexcel/parts/'. $filename; $objReader = new PHPExcel_Reader_Excel2007(); $objExcel = $objReader->load( $load_path ); $sheetNo = 0; $objExcel->setActiveSheetIndex($sheetNo); $sheet = $objExcel->getActiveSheet(); $sheet->setTitle('0'); $val = $xlsDataDetail; // 改シート $objAddExcel = $objReader->load( $load_add_path ); $addSheet = $objAddExcel->getSheet(0)->copy(); // test3sheet.xlsxの1シート目 unset($objAddExcel); $objExcel->addExternalSheet($addSheet); unset($addSheet); $sheetNo++; $objExcel->setActiveSheetIndex($sheetNo); $sheet = $objExcel->getActiveSheet(); $sheet->setTitle('請求書'); $str = 'test1'; $sheet->setCellValue("A2", $str); // 仮にtest1出力 // 改シート $objAddExcel = $objReader->load( $load_add_path ); $addSheet = $objAddExcel->getSheet(1)->copy(); // test3sheet.xlsxの2シート目 unset($objAddExcel); $objExcel->addExternalSheet($addSheet); unset($addSheet); $sheetNo++; $objExcel->setActiveSheetIndex($sheetNo); $sheet = $objExcel->getActiveSheet(); $sheet->setTitle('請求明細書'); $str = 'test2'; $sheet->setCellValue("A2", $str); // 仮にtest2出力 $objAddExcel = $objReader->load( $load_add_path ); $addSheet = $objAddExcel->getSheet(2)->copy(); // test3sheet.xlsxの3シート目 unset($objAddExcel); $objExcel->addExternalSheet($addSheet); unset($addSheet); $sheetNo++; $objExcel->setActiveSheetIndex($sheetNo); $sheet = $objExcel->getActiveSheet(); $sheet->setTitle('請求書控え'); $str = 'test3'; $sheet->setCellValue("A2", $str); // 仮にtest3出力 // 最初に読み込んだシートを削除する。 $objExcel->removeSheetByIndex(0); $filename = date('YmdHis'); $objWriter = new PHPExcel_Writer_Excel2007( $objExcel ); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment;filename=seikyuu_{$filename}.xlsx"); header("Content-Transfer-Encoding: binary "); $objWriter->save('php://output'); unset($sheet); unset($objExcel); unset($objWriter);