phpExcel: getCalculatedValue () возвратит #VALUE

может кто-нибудь помочь мне с кодом phpExcel:

Этот Код:

$objPHPExcel->getActiveSheet()->getCell("AF19")->getCalculatedValue();
$objPHPExcel->getActiveSheet()->getCell("AF19")->getFormattedValue();
$objPHPExcel->getActiveSheet()->getCell("AF19")->getValue();

возвращает:

#VALUE!
#VALUE!
=AE19*I19

спасибо заранее! :)

6 ответов


чтобы помочь отладить проблему, запустите вычисление в режиме отладки:

function testFormula($sheet,$cell) {
    $formulaValue = $sheet->getCell($cell)->getValue();
    echo 'Formula Value is' , $formulaValue , PHP_EOL;
    $expectedValue = $sheet->getCell($cell)->getOldCalculatedValue();
    echo 'Expected Value is '  , 
          ((!is_null($expectedValue)) ? 
              $expectedValue : 
              'UNKNOWN'
          ) , PHP_EOL;

    $calculate = false;
    try {
        $tokens = PHPExcel_Calculation::getInstance()->parseFormula($formulaValue,$sheet->getCell($cell));
        echo 'Parser Stack :-' , PHP_EOL;
        print_r($tokens);
        echo PHP_EOL;
        $calculate = true;
    } catch (Exception $e) {
        echo 'PARSER ERROR: ' , $e->getMessage() , PHP_EOL;

        echo 'Parser Stack :-' , PHP_EOL;
        print_r($tokens);
        echo PHP_EOL;
    }

    if ($calculate) {
        try {
            $cellValue = $sheet->getCell($cell)->getCalculatedValue();
            echo 'Calculated Value is ' , $cellValue , PHP_EOL;

            echo 'Evaluation Log:' , PHP_EOL;
            print_r(PHPExcel_Calculation::getInstance()->debugLog);
            echo PHP_EOL;
        } catch (Exception $e) {
            echo 'CALCULATION ENGINE ERROR: ' , $e->getMessage() , PHP_EOL;

            echo 'Evaluation Log:' , PHP_EOL;
            print_r(PHPExcel_Calculation::getInstance()->debugLog);
            echo PHP_EOL;
        }
    }
}

$sheet = $objPHPExcel->getActiveSheet();
PHPExcel_Calculation::getInstance()->writeDebugLog = true;

testFormula($sheet,'AF19');

вывод из этого должен помочь диагностировать проблему


Если вы не уверены в содержимом ячейки (включая значение или формулу), я рекомендую вам в первую очередь проверить, имеет ли ячейка формулу, а затем скопировать и вставить соответственно. getOldCalculatedValue () очень полезен в этом случае. Вот пример этого:

$code = $sheet->getCell('A'.$y)->getValue();
if(strstr($code,'=')==true)
{
    $code = $sheet->getCell('A'.$y)->getOldCalculatedValue();
}
$objPHPExcel4->setActiveSheetIndex(0)
             ->setCellValue('A'.$l, $code);

для больших наборов данных функция getCalculatedValue () действительно громоздка, и для правильной работы потребуется много памяти.


Я столкнулся с аналогичной проблемой, getCalculatedValue () вернул #VALUE! на ячейке, которая ссылается на другую ячейку, содержащую формулу.

причиной стала одна из ячеек, на которую ссылаются, содержащая нулевое значение, хотя Excel обработал это правильно. Все, что мне нужно было сделать, это добавить значение 0 в эту ячейку, и она вычислялась нормально.


вы должны попробовать открыть исходный файл Excel и посмотреть на ячейку AF19. Скорее всего, даже сама MS Excel испытывает проблемы с вычислением значения из-за того, что что-то не так с формулой, расположенной в AF19.

может быть,

эта формула пытается умножить две ячейки, которые не содержат число

=AE19*I19

AE19 содержит запятую и не отформатирован как так PHPExcel видит его как строку

в таком случае вы можете сначала попробовать форматировать данные в excel, щелкнув правой кнопкой мыши (в excel) и указав числовой формат.


Я думаю, что корень этой проблемы появляется, когда ячейка пуста. Если ячейке задана пустая строка, некоторые формулы могут завершиться ошибкой. Вот пример формулы, которая терпит неудачу:

=TEXT(A1, "mm/dd/yyyy")

для того, чтобы справиться с этим "#VALUE!"проблема, на небольшом проекте я устанавливаю пустые ячейки в NULL вместо ''.

$target = ($target == '')? NULL: $target; // without this, empty cells end up being #VALUE! after some formulas


/ / вы можете установить вот так

$objPHPExcel->getActiveSheet()->setCellValue('A20','=AE19 * I19');

/ / потому что php excel определяет код в строке, поэтому вы получите ошибку. потому что в phpexcel вы должны использовать формулу excel. не могу сделать так, как это A1+A2 или ohters.

вы можете умножать в php, как это

$bil1 = $objPHPExcel->getActiveSheet()->getCell("AE19")->getValue()

$bl2 = $objPHPExcel->getActiveSheet()->getCell("I19")->getValue()

//функция умножения.

$total=$bil1*$bil2;

после этого вы можете установить общую сумму в ячейке

$objPHPExcel->getActiveSheet()->setCellValue('A20',$total);

это работает в моем php.