複数シートを対象に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);