在phpexcel中复制工作表时出错

时间:2014-12-24 16:21:52

标签: phpexcel

我正在尝试按如下方式在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);

1 个答案:

答案 0 :(得分:1)

addExternalSheet()方法实际上从旧工作簿中删除了工作表并将其移动到新工作表,但是旧工作簿工作表集合上的迭代器仍然认为它不再包含该工作表。< / p>

在你的第二个“workround”代码中,你没有从旧工作簿中删除工作表,直到你完成第一个循环的迭代,你只是设置一个指向工作表的指针数组,然后迭代那个数组,所以指针数组并不关心工作表是从一个工作簿移动到另一个工作簿,它们都存在,所以没有错误。

另一种方法可能是对旧工作簿使用工作表迭代器,它应该在删除工作表时干净地更新。