【问题标题】:Error copying sheets in phpexcel在phpexcel中复制工作表时出错
【发布时间】:2014-12-24 16:21:51
【问题描述】:

我正在尝试在 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);
        }

(工作表是工作表范围内的索引数组。我使用 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);

【问题讨论】:

    标签: phpexcel


    【解决方案1】:

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

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

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

    【讨论】:

    • 你能给出一个代码示例吗?从你的回答中看不太清楚。另外,我的解决方案是否存在错误/问题?谢谢
    猜你喜欢
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多