我正在尝试按如下方式在phpexcel中提取一些工作表(请参阅https://stackoverflow.com/a/10587576/813801以供参考)。
$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);
}
(sheet是一个索引数组,位于工作表的范围内。我用listWorksheetInfo检查过)
如果我注释掉最后一行$ newObjPHPExcel-> addExternalSheet($ workSheet);
getSheet方法工作正常。否则,我收到一个错误:
致命错误:未捕获的异常'PHPExcel_Exception',消息'您请求的工作表索引:2超出范围。实际的床单数是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);
答案 0 :(得分:1)
addExternalSheet()
方法实际上从旧工作簿中删除了工作表并将其移动到新工作表,但是旧工作簿工作表集合上的迭代器仍然认为它不再包含该工作表。< / p>
在你的第二个“workround”代码中,你没有从旧工作簿中删除工作表,直到你完成第一个循环的迭代,你只是设置一个指向工作表的指针数组,然后迭代那个数组,所以指针数组并不关心工作表是从一个工作簿移动到另一个工作簿,它们都存在,所以没有错误。
另一种方法可能是对旧工作簿使用工作表迭代器,它应该在删除工作表时干净地更新。