2016-07-11 9 views
0

行の量に応じて最初のワークシートを数回クローンする必要がありますが、何かが間違っている可能性があります。PHPExcelクローンワークシート - 効率的なメモリの使用

コードは次のとおりです。

public function downloadFile() 
{ 
    date_default_timezone_set('America/Sao_Paulo'); 

    if(file_exists("xpto.xlsx")){ 

     $objPHPExcel = PHPExcel_IOFactory::load("xpto.xlsx"); 

     $sheets = 3;//3 is enough to throw the error 
     for($i = 0; $i<$sheets; $i++){ 

      $objClonedWorksheet = clone $objPHPExcel->getSheet(0); 
      $objClonedWorksheet->setTitle('Sheet ' . $i); 
      $objClonedWorksheet->setCellValue('A1', 'Test ' . $i); 
      $objPHPExcel->addSheet($objClonedWorksheet); 
     } 

     $objPHPExcel->setActiveSheetIndex(0); 

     $filename = 'file.xlsx'; 
     header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
     header('Content-Disposition: attachment;filename="'.$filename.'"'); 
     header('Cache-Control: max-age=0'); 

     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
     ob_end_clean(); 
     $ret = $objWriter->save('php://output'); 

     exit; 
    } 
} 

しかし、私は疲れメモリエラーを得ました。私は

ini_set('memory_limit', '-1'); 

を追加することで、ほとんどのコメントソリューションを(それが実際に回避策です)しようとしたよりも、私はちょうどロード関数の後に次の行を追加し、それが働いていたが、私はそれがに良い解決策だとは思いませんSaaSアプリケーションで使用できます。私はほとんどのホスト(AWSなど)が私にそれを使うことを許可するとは思えない。

また、forループの前にシートを複製しようとしましたが、addSheetを使用すると、この関数は新しいオブジェクトを作成しないことに気付きました。ループ)、それは "同じ名前の既存のシート"エラーを投げ、作成された最後のシートを変更します。記載されている@rhazenのリンクのいずれかを使用しようとすると

は、私は、ループに変更:

しかし、どちらか動作しないようです。 IteratorまたはXfIndexに関する誤解はありますか?

うーん...私は、上記の問題のため答えを見つけられませんでしたが、私はマーク・ベイカーの提案をしようとすることを決めた、それは結果を処理するのにかかる時間にもかかわらず、それが働いた溶液でした。私は私のサーバーホストが私にそれを使用させることを願っています。

ソリューションは、次のようになります。

public function downloadFile() 
{ 
    date_default_timezone_set('America/Sao_Paulo'); 

    if(file_exists("xpto.xlsx")){ 

     $cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; 
     $cacheSettings = array(
       'memoryCacheSize' => '8MB' 
     ); 
     PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

     $objPHPExcel = PHPExcel_IOFactory::load("xpto.xlsx"); 

     $sheets = $this->calculateNumberOfSheets(); 
     for($i = 0; $i<$sheets; $i++){ 

      $objClonedWorksheet = clone $objPHPExcel->getSheet(0); 
      $objClonedWorksheet->setTitle('Sheet ' . $i); 
      $objClonedWorksheet->setCellValue('A1', 'Test ' . $i); 
      $objPHPExcel->addSheet($objClonedWorksheet); 
     } 

     $objPHPExcel->setActiveSheetIndex(0); 

     $filename = 'file.xlsx'; 
     header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
     header('Content-Disposition: attachment;filename="'.$filename.'"'); 
     header('Cache-Control: max-age=0'); 

     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
     ob_end_clean(); 
     $ret = $objWriter->save('php://output'); 

     exit; 
    } 
} 
+0

細胞のコレクションを持つワークシートが大量のメモリを取ることを考えると、それは、ワークシートを複製することは、あなたのスクリプトのメモリ使用量が増加していることは驚くべきことではないのです。これは便利かもしれないメモリフットプリント –

+0

を減らすために、[セルのキャッシング](https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/04-Configuration-Settings.md)を使用して考えてみます。http: //stackoverflow.com/questions/34774486/cloning-the-content-and-styling-of-one-sheet-to-another-php-excel and this one:http://stackoverflow.com/questions/4817651/phpexcel -runs-out-of-256-512-and-also-1024mb-of-ram – rhazen

答えて

0

ソリューションは、編集された問題です。助けてくれた人に感謝します。

関連する問題