PHPExcel редактирует ячейки и сохраняет их повторно - «Недопустимая координата ячейки»

Я пытаюсь изменить загруженную электронную таблицу Google doc, а затем сохранить ее на своем сервере. Загрузка файла в порядке, я сохраняю его на своем сервере, и он открывается нормально, и все в порядке. Проблема возникает, когда я загружаю файл в объект PHPExcel, а затем изменяю некоторые ячейки, а затем повторно сохраняю измененный файл. Может ли кто-нибудь увидеть, где я ошибаюсь? Не обращайте внимания на строки, получающие стоимость акций из базы данных, они правильно закодированы в моем коде. Я только что удалил запрос из вставленного примера кода.

Я получаю сообщение об ошибке:

Неустранимая ошибка: необработанное исключение «Исключение» с сообщением «Недопустимая координата ячейки» «ТЕКУЩИЕ ПРОДУКТЫ»! A2» в .. /PHPExcel\Classes\PHPExcel\Cell.php:508 Трассировка стека: #0 ....

function updateDoc($url)
{
    file_put_contents("filename.xlsx",fopen($url,"r"));
    $filename = "filename.xlsx";
    $objReader = PHPExcel_IOFactory::createReader('Excel2007');
    $objReader->setReadDataOnly(true);
    $excel2 = $objReader->load('filename.xlsx'); 
    $excel2->setActiveSheetIndexByName("Current Products");
    $rowIterator = $excel2->getActiveSheet()->getRowIterator();
    $rows = 1;
    $columnAsLetters = 'E';
    foreach($rowIterator as $row)
    {
        if($rows <= 2)
        {   
            continue;//skip first 2 rows
        }
        else
        {
            $data = $excel2->getActiveSheet()->getCell($columnAsLetters.$rows)->getCalculatedValue();
            $sku = trim($data);
            $stock = //** I select stock from database **// 
            $r = //** returned sql row **//
            $stk = $r[0];
            $excel2->getActiveSheet()->setCellValue("G" . $rows, $stk);
        }
        $rows++;
    }

    $objWriter = PHPExcel_IOFactory::createWriter($excel2, 'Excel2007');
    $objWriter->setPreCalculateFormulas(FALSE);
    $objWriter->save('filename2.xlsx');
}

person m_grif    schedule 24.11.2015    source источник
comment
Какая строка в вашем коде вызывает исключение и какое фактическое значение вы пытаетесь сохранить?   -  person Alon Eitan    schedule 24.11.2015
comment
@Alon Насколько я могу судить, комментируя различные разделы, это последняя строка $objWriter-›save('filename2.xlsx'); который выдает ошибку. Я просто пытаюсь перезаписать стоимость акций в столбце G новой стоимостью акций, взятой из базы данных.   -  person m_grif    schedule 24.11.2015


Ответы (1)


Хорошо, у меня наконец-то это работает. Мне пришлось переписать его так, чтобы я создал второй объект PHPExcel и создал новый файл, скопировав значение каждой ячейки из исходного файла в новый файл и обновив значения, которые я хочу обновить, когда я копирую файл в новый один. Я вручную установил количество столбцов/строк для копирования, потому что знаю, сколько требуется. Мне также пришлось изменить файл Calculation.php PHPExcel, так как в моем файле есть vlookup, который ссылается на лист, который не существует в файле, и он продолжал выдавать ошибку вызова функции cellExists для не объекта, поэтому я добавил проверьте, существует ли лист, прежде чем пытаться получить ячейку. Мой код сейчас:

function updateDoc($url)
{
    file_put_contents("filename.xlsx",fopen($url,"r"));
    $filename = "filename.xlsx";
    $objPHPExcel = new PHPExcel();
    $objReader = new PHPExcel_Reader_Excel2007();
    $objReader->setLoadAllSheets();
    $objPHPExcel = $objReader->load($filename);
    $sheets = $objReader->listWorksheetNames($filename);
    // Created file 
    $objPHPExcel2 = new PHPExcel();
    $objPHPExcel2->getProperties()->setCreator("User")
                    ->setLastModifiedBy("User")
                    ->setTitle("filename2")
                    ->setSubject("filename2")
                    ->setDescription("filename2")
                    ->setCategory("PublicWEB");
    $s=0;
    foreach($sheets as $sheet)
    {
        if($s != 0)
        {
            $objPHPExcel2->createSheet($s);
            $objPHPExcel2->getSheet($s)->setTitle($sheet);
        }
        else
        {
            $objPHPExcel2->getSheet($s)->setTitle($sheet);
        }
        $objPHPExcel->setActiveSheetIndexByName($sheet);
        $objPHPExcel2->setActiveSheetIndex($s);
        for($rows = 1 ; $rows < 250 ; $rows++)
        {
            for ($col=0 ;$col < 100 ; $col++) 
            {

                $cellV = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col, $rows)->getValue();
                if($sheet == "Current Products" && $col == 6 && $rows > 2)
                {
                    $data = $objPHPExcel2->getActiveSheet()->getCellByColumnAndRow(4,$rows)->getValue();
                    $sku = trim($data);
                    if($sku != "")
                    {
                        $stock = $mysqli->query("SELECT stock FROM table WHERE partno = '$sku'");
                        if($stock->num_rows > 0)
                        {
                            $r = $stock->fetch_array();
                            $stk = $r[0];
                            $objPHPExcel2->getActiveSheet()->setCellValueByColumnAndRow($col, $rows, $stk );

                        }
                        else
                        {
                            $objPHPExcel2->getActiveSheet()->setCellValueByColumnAndRow($col, $rows, "NA" );
                        }
                    }
                    else
                    {
                        $objPHPExcel2->getActiveSheet()->setCellValueByColumnAndRow($col, $rows, "" );
                    }
                }
                else
                {
                    $objPHPExcel2->getActiveSheet()->setCellValueByColumnAndRow($col, $rows, $cellV );

                }
            }
        }
        ++$s;
    }
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel2, 'Excel2007'); 
    $objWriter->save('filename2.xlsx');
}
person m_grif    schedule 25.11.2015