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); 
     } 

나는 마지막 줄에 $ newObjPHPExcel-> addExternalSheet ($ 워크 시트) 주석 경우 (. 시트는 시트의 범위 내에있는 인덱스의 배열은 내가 listWorksheetInfo에 체크)

getSheet 메서드가 제대로 작동합니다. 그렇지 않으면 오류가 발생합니다.

치명적 오류 : 'Canvas가 요청한 시트 인덱스 : 2가 범위를 벗어났습니다.'라는 메시지와 함께 캐치되지 않는 예외 'PHPExcel_Exception'. 실제 시트 수는 1입니다. ' /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

작업 환경에는 문제가 없습니다. –

관련 문제