シート数が多くなると加速度的にコピーが遅くなる場合、原因はシート間の参照を正しく調整するための処理を走らせていることである。
タイトル変更時にその処理が実行されるので、以下のように修正することでシートコピーを高速化できる。
これにより50シートをコピーする処理が、35秒→2秒と劇的な改善をすることができた。
// 高速化前 $sheet = $baseSheet->copy(); $sheet->setTitle("newSheet" . $sheetNum); $book->addSheet( $sheet ); // ↓ // 高速化後 $sheet = $baseSheet->copy(); $sheet->setTitle("newSheet" . $sheetNum, false); // 引数:updateFormulaCellReferences にfalseを渡す $book->addSheet( $sheet );
当然、別シートから参照しているセルがあるときにこの対応をするとマズイ。
データがおかしくなるか、バグで開けないExcelが出来るんだと思う。(試してない)