2011-01-03 55 views
29

Tengo el siguiente archivo Excel:¿Cómo se lee automáticamente en valores calculados con PHPExcel?

alt text

lo leí en por bucle sobre cada célula y conseguir el valor con 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; 
} 

Sin embargo, a pesar de que lee en la multa de datos, se lee en los cálculos literalmente:

alt text

que entiendo de discusiones like this one que puedo usar para getCalculatedValue() celdas calculadas.

El problema es que en las hojas de Excel que estoy importando, no sé de antemano qué celdas se calculan y cuáles no.

¿Hay alguna manera de leer el valor de una celda de forma que obtenga automáticamente el valor si tiene un valor simple y obtiene el resultado del cálculo si se trata de un cálculo?

Respuesta:

Resulta que getCalculatedValue() obras para todas las células, hace que me pregunte por qué esto no es lo habitual en getValue() ya que yo creo que por lo general se querría el valor de los cálculos en lugar de las ecuaciones sí, en todo caso, esto funciona:

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

alt text

+6

Un problema al usar 'getCalculatedValue()' podría ser la conversión automática de valores numéricos con ceros a la izquierda. P.ej. '0600' se calculará '600', mientras que se necesita la cadena '0600' en PHP/base de datos. Por lo tanto, estoy usando 'getValue()' al principio para recuperar el contenido de una celda, luego identifico las ecuaciones por medio de un '=' para obtener su valor calculado por 'getCalculatedValue()'. – proximus

+0

'PHPExcel' ahora ha sido reemplazado por' PhpSpreadsheet' – Dennis

Respuesta

-2

nunca han importado un archivo de Excel en PHP por lo que esta es sólo una puñalada en la oscuridad.

por qué no echa el primer carácter de la célula por un "="

Si es verdad getCalculatedValue()
si no getCell()

+0

La biblioteca PHPExcel tiene una función para este problema exacto y enmascara el signo =. La llamada a getValue(), devuelve el cálculo que permitiría que su solución funcione, pero como respondió Mark Baker en los comentarios a Edward Tanquay, las funciones adecuadas sí existen. –

22

getCalculatedValue() parece funcionar para todas las células, véase más arriba

+2

getCalculatedValue() devolverá el valor calculado para una celda que contenga una fórmula, o el valor real para una celda que no sea de fórmula. getValue() siempre devolverá el valor real de una celda, incluida la fórmula de una celda que contiene una fórmula. getFormattedValue() devolverá el valor calculado para una celda de fórmula, o el valor real para una celda sin fórmula, con cualquier máscara de formato de número aplicada, como una cadena. –

+2

En cuanto a por qué getValue() devuelve la fórmula, razones históricas. En algún momento, planeo introducir los métodos getFormula()/setFormula(), desaprobar getCalculatedValue() y cambiar getValue() para devolver el valor calculado ... pero necesito hacerlo gradualmente en varios lanzamientos para permitir el retroceso compatibilidad. –

+1

Descubrí una razón por la que es bueno que 'getCalculatedValue()' no sea el predeterminado: después de cambiarlo a 'getCalculatedValue()', el proceso de PHP se estaba quedando sin memoria procesando el Excel de 3MM, ya que hay muchos cálculos, presumiblemente con VLOOKUP desde 1..65535. Pero dado que tengo la opción de calcular cada celda o no, puedo hacer "cálculos inteligentes" de una hoja, p. calcule 'SUM's simple pero no el recurso intensivo' VLOOKUP's –

0

getCalculatedValue() parece hacer bien el trabajo que quería: se devolverá el valor correcto si la celda contiene FBV (valor basado fórmula) si no, se le devolverá el valor normal en lugar ...

(perdón por el inglés malo)

6

Parece que getCalculatedValue() está en desuso. Intenta usar getFormattedValue() en su lugar.

+3

getOldCalculatedValue() funciona para mí –

6

Si no está seguro sobre el contenido de una celda (valor o fórmula incluida), Le recomiendo que haga una comprobación principalmente si la celda tiene una fórmula y luego copie y pegue en consecuencia. getOldCalculatedValue() es muy útil en este caso.Aquí está un ejemplo de ello:

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

Para grandes conjuntos de datos, la función getCalculatedValue() es muy complicado y se requiere mucha memoria para llevar a cabo correctamente.

Cuestiones relacionadas