###実現したいこと
PHPExcelを用いて、ファイルのアウトプットを試みています。
テンプレートとなるExcelファイルを読み込んで、該当シートを削除して出力するものです。
削除するシート枚数が増えると、エラーが発生してしまい破損したファイルが生成されてしまい困っています。
テンプレートファイルには25枚のシートが含まれており、そのうち20枚のシートを削除してファイルを出力したいです。
###前提
テンプレートとなるExcelファイル
ファイル名:template.xlsx
サイズ容量:500KB
シートが『サンプルあ』『サンプルい』『サンプルう』『サンプルえ』『サンプルお』のように
『サンプルあ』から『サンプルの』まで25枚のシートが含まれています。
そのうち
『サンプルあ』から『サンプルと』までの20枚のシートを削除したうえで、ファイルを出力します。
ファイルは最終的に同じディレクトリ内に保存されるものとします。
###発生している問題・エラーメッセージ
Uncaught exception 'PHPExcel_Exception' with message 'Sheet does not exist.' in /example.com/file/Classes/PHPExcel.php:628 Stack trace: #0 /example.com/file/Classes/PHPExcel/Writer/Excel2007/Workbook.php(325): PHPExcel->getIndex(Object(PHPExcel_Worksheet)) #1 /example.com/file/Classes/PHPExcel/Writer/Excel2007/Workbook.php(308): PHPExcel_Writer_Excel2007_Workbook->_writeDefinedNameForNamedRange(Object(PHPExcel_Shared_XMLWriter), Object(PHPExcel_NamedRange)) #2 /example.com/file/Classes/PHPExcel/Writer/Excel2007/Workbook.php(277): PHPExcel_Writer_Excel2007_Workbook->_writeNamedRanges(Object(PHPExcel_Shared_XMLWriter), Object(PHPExcel)) #3 /example.com/file/Classes/PHPExcel/Writer/Excel2007/W in /example.com/file/Classes/PHPExcel.php on line 628
どうやらファイル出力時の処理で、シートが存在しないと表示されているようです。
###該当のソースコード
//PHPExcelの読み込み
$reader = PHPExcel_IOFactory::createReader('Excel2007');
$excel = $reader->load(dirname(FILE) . '/template.xlsx');
//削除するシート名を配列入力。
$deleteSheet = array('サンプルあ','サンプルい','サンプルう','サンプルえ','サンプルお','サンプルか','サンプルき','サンプルく','サンプルけ','サンプルこ','サンプルさ','サンプルし','サンプルす','サンプルせ','サンプルそ','サンプルた','サンプルち','サンプルつ','サンプルて','サンプルと');
// シートをExcelブックから削除する
for ($i = 0; $i < count($deleteSheet); $i++) {
$deleteSheetindex = $excel->getIndex($excel-> getSheetByName($deleteSheet[$i]));
$excel->removeSheetByIndex($deleteSheetindex);
}
//output.xlsxとして出力する
$objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
$objWriter->save("output.xlsx");
###試したこと
- 削除するシート数を少なくする。→成功
$deleteSheetを『サンプルあ』から『サンプルそ』までの15枚のシートを設定したら、無事に処理が完了します。
- 各シートに含まれる記載量を少なくする。→成功
各シートを全て空白にすると問題なく出力ができます。
3. キャッシュを設定して処理する。→失敗
// キャッシュを設定してみる
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '32MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
###補足情報
テンプレートとなる元のファイルは、サイズ容量が500KBで、ファイルの出力に少し時間がかかっている印象があります。15枚のシート削除は無事に完了し、20枚のシート削除では処理落ちしているということは何らかメモリなどの数字を上げればいいのでは等の検討はつくのですが、最終的に解決に至ってない状況です。
皆さまのお知恵をお借りしたいです。よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。