Как автоматически читать рассчитанные значения с помощью PHPExcel? - PullRequest
38 голосов
/ 03 января 2011

У меня есть следующий Excel файл:

alt text

Я прочитал его, зациклив над каждой ячейкой и получив значение с помощью getCell(...)->getValue():

$highestColumnAsLetters = $this->objPHPExcel->setActiveSheetIndex(0)->getHighestColumn(); //e.g. 'AK'
$highestRowNumber = $this->objPHPExcel->setActiveSheetIndex(0)->getHighestRow();
$highestColumnAsLetters++;
for ($row = 1; $row < $highestRowNumber + 1; $row++) {
    $dataset = array();
    for ($columnAsLetters = 'A'; $columnAsLetters != $highestColumnAsLetters; $columnAsLetters++) {
        $dataset[] = $this->objPHPExcel->setActiveSheetIndex(0)->getCell($columnAsLetters.$row)->getValue();
        if ($row == 1)
        {
        $this->column_names[] = $columnAsLetters;
        }
    }
    $this->datasets[] = $dataset;
}

Однако, несмотря на то, что он хорошо читает данные, в вычислениях он читает буквально :

alt text

Я понимаю из обсуждений как этот , что я могу использовать getCalculatedValue() для вычисленных ячеек.

Проблема в том, что в таблицах Excel, которые я импортирую, я заранее не знаю, какие ячейки рассчитываются, а какие нет.

Есть ли способ для меня прочитать значение ячейки таким образом, чтобы автоматически получать значение, если оно имеет простое значение, и получать результат вычисления, если это вычисление?

Ответ:

Оказывается, что getCalculatedValue() работает для всех ячеек, меня удивляет, почему это не значение по умолчанию для getValue(), так как я думаю, что в любом случае обычно требуется значение вычислений вместо самих уравнений В случае, если это работает:

...->getCell($columnAsLetters.$row)->getCalculatedValue();

alt text

Ответы [ 5 ]

30 голосов
/ 03 января 2011

getCalculatedValue (), кажется, работает для всех ячеек, см. Выше

11 голосов
/ 22 июня 2015

Если вы не уверены в содержании ячейки (включая значение или формулу), Я рекомендую вам сначала проверить, есть ли в ячейке формула, а затем скопировать и вставить соответственно. 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 () действительно громоздка, и для ее правильной работы потребуется много памяти.

7 голосов
/ 23 сентября 2014

Похоже, что getCalculatedValue () устарела.Попробуйте вместо этого использовать getFormattedValue ().

0 голосов
/ 19 февраля 2014

getCalculatedValue(), кажется, делает правильную работу, которую вы хотели.Он вернет правильное значение, если ячейка содержит FBV (значение на основе формулы).Если нет, тогда будет возвращено нормальное значение.

0 голосов
/ 03 января 2011

Я никогда не импортировал файл Excel в PHP, так что это всего лишь удар в темноте.

Почему бы не проверить первый символ в ячейке на "="

Если true, getCalculatedValue ()
если нет getCell ()

...