PHPExcel - Значение ячейки, ссылающейся на другую ячейку, не получено должным образом - PullRequest
4 голосов
/ 04 февраля 2012

У меня возникла эта проблема, когда я пытался извлечь информацию из файлов Excel.Вот моя ситуация: у меня 34 файла Excel, которые я получил от разных пользователей.

Я использую PHP версии 5 для извлечения из файлов Excel.Мой сценарий будет зацикливаться для всех файлов и снова зацикливаться в соответствии с именем листа, и, наконец, зацикливаться снова в соответствии с адресами ячеек.

Проблема возникла, когда пользователи вошли в ячейку, например, для = = A1, что означаетпользователи, ссылающиеся на значение ячейки в другой ячейке, потому что оно имеет то же значение, что и ячейка A1.

Когда я зарегистрировался в mysql (поскольку я сохранил их для будущего использования), я обнаружил, что запись для конкретной ячейки идентичнас другой записью, полученной из той же ячейки, но в другом файле Excel.Я имел в виду, что, поскольку мой php-скрипт будет циклически переходить от одного файла к другому, при первом чтении PHPExcel, например, для ячейки C3, которая имеет какое-то значение 3000 долларов США, следующие файлы PHPExcel могут перейти в ту же ячейку C3, но на этот разячейка C3 содержит формулу, которая ссылается на ячейку A1 (формула "= + A1"), которая имеет значение 5000 000 долларов США.

PHP-скрипт предполагает запись в mysql за 5000 долларов США, но это не так.Я подозреваю, что скрипт PHPExcel не очистил переменную в первом раунде.Я попытался unset ($ objPHPExcel) и уничтожить переменную, но это все еще происходит.

Моя кодировка проста следующим образом:

if(file_exists($inputFileName))
                                    {
                                        $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
                                        $objReader = PHPExcel_IOFactory::createReader($inputFileType);
                                        $objReader->setReadDataOnly(true);
                                        $objPHPExcel = $objReader->load($inputFileName);

                                        //to obtain date from FILE and store in DB for future comparison
                                        $validating_date_reporting = $objPHPExcel->getSheet(0)->getCell('C10')->getValue();
                                        $validating_date_reporting = PHPExcel_Style_NumberFormat::toFormattedString($validating_date_reporting,"YYYY-MMM-DD");
                                        $validating_date_reporting = date('Y-m-d',strtotime($validating_date_reporting));

                                        //first entry
                                        $entry = mysql_query('INSERT INTO `'.$table.'`(`broker_code`, `date`, `date_from_submission`) VALUES("'.$broker_code.'","'.$reporting_date.'","'.$reporting_date.'")') or die(mysql_error());

                                        foreach($cells_array as $caRef=>$sName)
                                        {
                                            foreach($sName as $sNameRef=>$cells)
                                                {

                                                    $wksht_page = array_search($caRef, $sheetNameArray);
                                                    $cell_column = $wksht_page.'_'.$cells;
                                                    echo $inputFileName.' '.$caRef.' '.$cell_column.'<br>';
                                                    $value = $objPHPExcel->setActiveSheetIndexByName($caRef)->getCell($cells)->getCalculatedValue();

                                                    echo $value.'<br>';

                                                        if($value)
                                                        {
                                                            $isdPortal->LoginDB($db_periodic_submission);
                                                            $record = mysql_query('UPDATE `'.$table.'` SET `'.$cell_column.'` = "'.$value.'" WHERE broker_code = "'.$broker_code.'" AND date_from_submission = "'.$validating_date_reporting.'"') or die(mysql_error());

                                                        }

                                                }

                                        }


                                    }

Я действительно надеюсь, что вы можете помочь мне здесь..

Заранее спасибо.

1 Ответ

6 голосов
/ 04 февраля 2012

PHPExcel также содержит кэш вычислений, и он не очищается при отмене сброса рабочей книги: его необходимо очищать вручную с помощью:

PHPExcel_Calculation::flushInstance();

или

PHPExcel_Calculation::getInstance()->clearCalculationCache();

Youтакже можно полностью отключить кэширование вычислений (хотя это может замедлить работу, если у вас много формул, ссылающихся на ячейки, содержащие другие формулы), используя:

PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(FALSE);

перед началом обработки файлов

Это потому, что в настоящее время PHPExcel использует синглтон для механизма вычислений.В планах по переходу на использование многотонной схемы позднее в этом году, что позволит эффективно поддерживать отдельный кэш для каждой рабочей книги, решая эту проблему.

РЕДАКТИРОВАТЬ

Обратите внимание, что просто отключение $ objPHPExcel не работает.Вам необходимо отсоединить рабочие листы перед тем, как отменить установку $ objPHPExcel.

$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);

, как описано в разделе 4.3 Документации разработчика.И это тот момент, когда вы должны также добавить PHPExcel_Calculation :: flushInstance ();

...