Posted on

PHPEXCELでEXCEL1ファイルで表など記述済3シートをそれぞれコピーして業務にあったEXCELを出力する方法例

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