2014-12-24 6 views
0

Я пытаюсь извлечь некоторые листы в phpexcel следующим образом (см. https://stackoverflow.com/a/10587576/813801 для справки).Ошибка копирования листов в phpexcel

 $newObjPHPExcel = new PHPExcel(); 
     $newObjPHPExcel->removeSheetByIndex(0); //remove first default sheet 

     foreach ($sheets as $sheetIndex) { 
      echo "trying-$sheetIndex\n"; 
      $workSheet = $objPHPExcel->getSheet($sheetIndex); 
      echo "done-$sheetIndex\n"; 
      $newObjPHPExcel->addExternalSheet($workSheet); 
     } 

(листы представляет собой массив индексов, которые в пределах листа я проверил с listWorksheetInfo.)

Если я закомментируйте последнюю строку $ newObjPHPExcel-> addExternalSheet ($ WorkSheet);

Метод getSheet работает нормально. В противном случае, я получаю сообщение об ошибке:

Неустранимая ошибка: исключить исключение «PHPExcel_Exception» с сообщением «Ваш запрошенный индекс листа: 2 выходит за пределы. Фактическое количество листов равно 1. ' in /Xls/PHPExcel/PHPExcel.php:577

Зачем мешать newObjPHPExcel с objPHPExcel?

ОБНОВЛЕНИЕ: Я нашел обходное решение, которое, похоже, работает. не знаю, почему другая версия не работает.

 $newObjPHPExcel = new PHPExcel(); 
     $newObjPHPExcel->removeSheetByIndex(0); //remove first default sheet 

     foreach ($sheets as $sheetIndex) { 
      echo "trying-$sheetIndex\n"; 
      $workSheet[] = $objPHPExcel->getSheet($sheetIndex); 
      echo "done-$sheetIndex\n"; 
     } 

     foreach ($workSheet as $obj) 
      $newObjPHPExcel->addExternalSheet($obj); 

ответ

1

Метод addExternalSheet() фактически удаляет лист из старой книги и перемещает его в новом, но ваш итератор над старой коллекцией рабочей книги листов по-прежнему считает, что она не содержит, что рабочий лист, когда он больше не делает.

В вашем втором коде «workround» вы не удаляете листы из старой книги до тех пор, пока вы не закончите итерацию по первому циклу, вы просто устанавливаете массив указателей на листы, а затем итерацию над этим массивом, поэтому для массива указателей все равно, что листы перемещаются из одной книги в другую, все они все еще существуют, поэтому нет ошибок.

Альтернативой может быть использование итератора рабочего листа в отношении старой книги, которая должна обновляться чисто по мере удаления листов.

+0

Вы можете привести пример кода? не так ясно из вашего ответа. также, является ли моя ошибка в решении/проблема бесплатной? спасибо – user813801

+1

Нет проблем с вашим workround –