$reader = PHPExcel_IOFactory::createReader('Excel5'); $excel = $reader->load('template.xls'); $tempSheet = $excel->getSheet(0); for( ある回数分繰り返し ) { $cloneSheet = $tempSheet->copy(); $excel->addSheet( $cloneSheet ); ( $cloneSheet への編集処理 ) } $excel->removeSheetByIndex( 0 ); $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5'); $writer->save('new.xls');
で、掲題の
Notice: Undefined offset … PHPExcel.php on line 191
が、出てしまう。
出現箇所は、
$writer->save(‘new.xls’);
編集処理のところに
$cloneSheet->getStyle(‘A1′)->getFont()->setBold(true);
を入れた時点で、このメッセージが出るようになった。
それで、メッセージ内容に従い、PHPExcel.php 191行目をみてみると getActiveSheet() の中で出ていることが判明。
echo “count=” . $this->_workSheetCollection;
echo “index=” . $this->_activeSheetIndex;
とやって、配列数とインデックスを表示するという調査を行ったところ、
$excel->removeSheetByIndex(0)
でシート削除した後も
$excel->addSheet()
した、最終Sheetのインデックスを$this->_activeSheetIndex
として、内部で持っているようである。
なので、シート削除直後に
$excel->setActiveSheetIndex(0);
を挿入することで、掲題のメッセージは表示されなくなった。
なんか、バグっぽい!!
それともうひとつ、
$cloneSheet への編集処理を
$excel->addSheet( $cloneSheet );
の後で行なっているのは何故か?
先に編集処理を行うと、また 編集処理中の setBold() のせいで
PHP Fatal error: Call to a member function getStyle() on a non-object in Style/Font.php on line 386
になってしまう。
それで、またメッセージ内容に従い、Font.php 386行目を見てみた。
$this->getActiveSheet()->getStyle(…);
でエラーになっているらしい。
つまり、コピーしたばかりの $cloneSheet には、所属するBook(PHPExcelオブジェクト)がなく、getActiveSheet() が失敗するということらしい。