web-dev-qa-db-fra.com

Comment lire automatiquement les valeurs calculées avec PHPExcel?

J'ai le fichier - Excel suivant:

alt text

Je l'ai lu par en boucle sur chaque cellule et en obtenant la valeur avec 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;
}

Cependant, même s'il lit bien les données, il lit dans les calculs littéralement:

alt text

Je comprends des discussions comme celle-ci que je peux utiliser getCalculatedValue() pour les cellules calculées.

Le problème est que dans les feuilles Excel que j'importe, je ne sais pas au préalable quelles cellules sont calculées et lesquelles ne le sont pas.

Existe-t-il un moyen pour moi de lire la valeur d'une cellule d'une manière qui obtient automatiquement la valeur si elle a une valeur simple et obtient le résultat du calcul s'il s'agit d'un calcul?

Répondre:

Il s'avère que getCalculatedValue() fonctionne pour toutes les cellules, je me demande pourquoi ce n'est pas la valeur par défaut pour getValue() car je pense que l'on voudrait généralement la valeur des calculs au lieu de la équations elles-mêmes, en tout cas cela fonctionne:

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

alt text

38
Edward Tanguay

getCalculatedValue () semble fonctionner pour toutes les cellules, voir ci-dessus

30
Edward Tanguay

Si vous n'êtes pas sûr du contenu d'une cellule (valeur ou formule incluse), je vous recommande de vérifier principalement si la cellule a une formule, puis de copier-coller en conséquence. getOldCalculatedValue () est très utile dans ce cas. En voici un exemple:

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

Pour les grands ensembles de données, la fonction getCalculatedValue () est vraiment encombrante et beaucoup de mémoire sera nécessaire pour fonctionner correctement.

11
pancy1

Il semble que getCalculatedValue () soit obsolète. Essayez plutôt d'utiliser getFormattedValue ().

7
J-who

getCalculatedValue() semble faire le bon travail que vous vouliez. Il renverra la valeur correcte si la cellule contient FBV (valeur basée sur une formule). Sinon, la valeur normale sera renvoyée à la place.

0
user2244112