Monthly Archives: 11月 2012

Notice: Undefined offset … PHPExcel.php on line 191

$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() が失敗するということらしい。