2011-01-03 10 views
29

ich folgende Excel Datei haben:Wie berechnete Werte automatisch mit PHPExcel eingelesen werden?

alt text

ich es in durch Looping über jede Zelle und bekommen den Wert mit getCell(...)->getValue() lesen:

$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; 
} 

Doch obwohl es liest in den Daten fein, liest es in den Berechnungen wörtlich:

alt text

Ich verstehe von Diskussionen like this one, die ich getCalculatedValue() für berechnete Zellen verwenden können.

Das Problem ist, dass in den Excel-Blättern, die ich importiere, ich vorher nicht weiß, welche Zellen berechnet werden und welche nicht.

Gibt es eine Möglichkeit für mich, den Wert einer Zelle in einer Weise einzulesen, die automatisch den Wert erhält, wenn sie einen einfachen Wert hat und das Ergebnis der Berechnung erhält, wenn es sich um eine Berechnung handelt?

Antwort:

Es stellt sich heraus, dass getCalculatedValue() Werke für alle Zellen, macht mich fragen, warum dies nicht der Standard für getValue() da ich denke, würde man würde in der Regel den Wert der Berechnungen anstelle der Gleichungen wollen sich in jedem Fall das funktioniert:

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

alt text

+6

Ein Problem bei der Verwendung von 'getCalculatedValue()' könnte die automatische Konvertierung von numerischen Werten mit führenden Nullen sein. Z.B. '0600' wird zu '600' berechnet, während Sie auf PHP/Datenbank die Zeichenfolge '0600' benötigen. Deshalb benutze ich 'getValue()', um zuerst den Inhalt einer Zelle zu holen, und dann Gleichungen mit Hilfe eines führenden '=' zu identifizieren, um ihren berechneten Wert mit 'getCalculatedValue()' zu holen. – proximus

+0

'PHPExcel' wurde nun von' PhpSpreadsheet' ersetzt – Dennis

Antwort

-2

ich habe noch nie eine Excel-Datei in PHP importiert so dass dies nur ein Stich in der Dunkelheit ist.

Warum prüfen nicht das erste Zeichen in der Zelle für eine "="

Wenn true getCalculatedValue()
wenn nicht GetCell()

+0

Die PHPExcel Bibliothek hat eine Funktion für genau dieses Problem und maskiert das = Zeichen. Der Aufruf von getValue() gibt die Berechnung zurück, die es Ihrer Lösung ermöglichen würde zu arbeiten, aber wie von Mark Baker in den Kommentaren zu Edward Tanquay beantwortet, existieren die richtigen Funktionen. –

22

getCalculatedValue() scheint für alle Zellen zu arbeiten, siehe oben

+2

getCalculatedValue() gibt den berechneten Wert für eine Zelle mit einer Formel oder den tatsächlichen Wert für eine Zelle ohne Formel zurück. getValue() gibt immer den tatsächlichen Wert für eine Zelle zurück, einschließlich der Formel für eine Zelle, die eine Formel enthält. getFormattedValue() gibt den berechneten Wert für eine Formelzelle oder den tatsächlichen Wert für eine Zelle ohne Formel mit einer beliebigen angewendeten Zahlenformatierungsmaske als Zeichenfolge zurück. –

+2

Warum gibt getValue() die Formel zurück, historische Gründe. Irgendwann plane ich, die Methoden getFormula()/setFormula() einzuführen, getCalculatedValue() abzulehnen und getValue() zu ändern, um den berechneten Wert zurückzugeben ... aber ich muss dies schrittweise über mehrere Releases tun, um rückwärts zu gehen Kompatibilität. –

+1

Ich entdeckte einen Grund, warum es gut ist, dass 'getCalculatedValue()' tatsächlich nicht der Standard ist: Nachdem ich ihn in 'getCalculatedValue()' geändert hatte, lief der PHP-Prozess ständig aus viele Berechnungen, vermutlich mit SVERWEIS von 1..65535. Aber da ich die Wahl habe, jede Zelle zu berechnen oder nicht, kann ich "intelligente Berechnungen" eines Blattes, z.B. Berechne einfache 'SUM's, aber nicht die ressourcenintensive' SVERWEIS –

0

getCalculatedValue() scheint den richtigen Job zu tun, man wollte: es wird den richtigen Wert zurück, wenn die Zelle enthält FBV (Formel basierend Wert) wenn nicht, dann wird der Normalwert stattdessen zurückgegeben werden ...

(Entschuldigung für das schlechte Englisch)

6

Sieht aus wie getCalculatedValue() ist veraltet. Versuchen Sie stattdessen, getFormattedValue() zu verwenden.

+3

getOldCalculatedValue() Arbeit für mich –

6

Wenn Sie sich nicht sicher sind über den Inhalt einer Zelle (Wert oder Formel enthalten), Ich empfehle Ihnen in erster Linie eine Überprüfung, ob die Zelle eine Formel hat und dann kopieren - einfügen. getOldCalculatedValue() ist in diesem Fall sehr hilfreich.Hier ist ein Beispiel dafür:

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

Für große Datenmengen, getCalculatedValue() Funktion ist wirklich umständlich und viel Speicher erforderlich sein wird korrekt auszuführen.

Verwandte Themen