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です。

  1. // Excel2007用ライブラリ  
  2. require_once(APP. 'Vendor/phpexcel/PHPExcel/IOFactory.php');  
  3. require_once(APP. 'Vendor/phpexcel/PHPExcel/Writer/Excel2007.php');  
  4. require_once(APP. 'Vendor/phpexcel/PHPExcel/Reader/Excel2007.php');  
  5. Configure::write('debug', 0);       // debugコードを非表示  
  6. $filename = "test_base.xlsx";  
  7. $load_path = APP . '/Vendor/phpexcel/parts/'$filename;  
  8. $filename = "test3sheet.xlsx";  
  9. $load_add_path = APP . '/Vendor/phpexcel/parts/'$filename;  
  10. $objReader = new PHPExcel_Reader_Excel2007();  
  11. $objExcel = $objReader->load( $load_path );  
  12. $sheetNo = 0;  
  13. $objExcel->setActiveSheetIndex($sheetNo);  
  14. $sheet = $objExcel->getActiveSheet();  
  15. $sheet->setTitle('0');  
  16. $val = $xlsDataDetail;  
  17. // 改シート  
  18. $objAddExcel = $objReader->load( $load_add_path );  
  19. $addSheet = $objAddExcel->getSheet(0)->copy(); // test3sheet.xlsxの1シート目  
  20. unset($objAddExcel);  
  21. $objExcel->addExternalSheet($addSheet);  
  22. unset($addSheet);  
  23. $sheetNo++;  
  24. $objExcel->setActiveSheetIndex($sheetNo);  
  25. $sheet = $objExcel->getActiveSheet();  
  26. $sheet->setTitle('請求書');  
  27. $str = 'test1';  
  28. $sheet->setCellValue("A2"$str);   // 仮にtest1出力  
  29. // 改シート  
  30. $objAddExcel = $objReader->load( $load_add_path );  
  31. $addSheet = $objAddExcel->getSheet(1)->copy(); // test3sheet.xlsxの2シート目  
  32. unset($objAddExcel);  
  33. $objExcel->addExternalSheet($addSheet);  
  34. unset($addSheet);  
  35. $sheetNo++;  
  36. $objExcel->setActiveSheetIndex($sheetNo);  
  37. $sheet = $objExcel->getActiveSheet();  
  38. $sheet->setTitle('請求明細書');  
  39. $str = 'test2';  
  40. $sheet->setCellValue("A2"$str);   // 仮にtest2出力  
  41. $objAddExcel = $objReader->load( $load_add_path );  
  42. $addSheet = $objAddExcel->getSheet(2)->copy(); // test3sheet.xlsxの3シート目  
  43. unset($objAddExcel);  
  44. $objExcel->addExternalSheet($addSheet);  
  45. unset($addSheet);  
  46. $sheetNo++;  
  47. $objExcel->setActiveSheetIndex($sheetNo);  
  48. $sheet = $objExcel->getActiveSheet();  
  49. $sheet->setTitle('請求書控え');  
  50. $str = 'test3';  
  51. $sheet->setCellValue("A2"$str);   // 仮にtest3出力  
  52. // 最初に読み込んだシートを削除する。  
  53. $objExcel->removeSheetByIndex(0);  
  54. $filename = date('YmdHis');  
  55. $objWriter = new PHPExcel_Writer_Excel2007( $objExcel );  
  56. header("Pragma: public");  
  57. header("Expires: 0");  
  58. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");  
  59. header("Content-Type: application/force-download");  
  60. header("Content-Type: application/octet-stream");  
  61. header("Content-Type: application/download");  
  62. header("Content-Disposition: attachment;filename=seikyuu_{$filename}.xlsx");  
  63. header("Content-Transfer-Encoding: binary ");  
  64. $objWriter->save('php://output');  
  65. unset($sheet);  
  66. unset($objExcel);  
  67. unset($objWriter);