Laravel-excel: Laravel 4.2 / Laravel-Excel 1.3: Los números formateados como texto siguen apareciendo como número

Creado en 3 dic. 2015  ·  38Comentarios  ·  Fuente: Maatwebsite/Laravel-Excel

He estado jugando con esto durante unos días, pero simplemente no puedo hacer que funcione. Tengo algunos números largos (16 dígitos) almacenados en mi base de datos que luego estoy usando la función toArray () para crear mi hoja de cálculo xlsx excel. El código que estoy usando para formatear la columna:
$sheet->setColumnFormat(array( 'A' => '@' ));

Sin embargo, los números se muestran en Excel como números y se acortan con notación científica.

¿Hay algo que pueda hacer al respecto además de agregar un espacio a cada lado?

Soy consciente del límite de 15 dígitos de Excel, sin embargo, al formatear como texto, me hicieron creer que esto no sería un problema.

Comentario más útil

$ excel-> hoja ('personal', función ($ hoja) use ($ datos) {
$ hoja-> setColumnFormat (matriz (
'H' => '@',
));
$ hoja-> filas ($ datos, verdadero);
});

Espero que esto ayude ;)

Todos 38 comentarios

El mismo problema aquí, sin embargo, en mi caso, son cadenas de 14 dígitos.

Si desea evitar la notación científica para números largos en Excel, entonces necesita establecer una máscara de formato que muestre explícitamente esos valores como números ..... usar @ simplemente le dice a MS Excel que use su comportamiento predeterminado (que es usar formato científico para números más largos) .... Le sugiero que use una máscara de formato de #0 lugar

Incluso entonces no funciona. Esto es lo que probé: $ sheet-> setColumnFormat (['id' => '# 0']) ;. También sospecho que setColumnFormat no funciona tan bien con CSV, ya que probé varios formatos y realmente no tuvo ningún efecto en el formato de columna.

No sé si esto hace una diferencia, sin embargo, he estado usando $ sheet-> fromModel ($ result); y probé $ sheet-> fromArray ($ result-> toArray ()) y ambos resultaron en este problema.

Para aquellos que tienen este problema con CSV, creé el siguiente método:

función pública getStringIdAttribute ()
{
return '= "'. $ this-> id. '"';
}
y en la parte superior de mi modelo agregué:
protected $ appends = ['string_id'];

y eso obligó a que el número se mostrara como texto en Excel (así como en Kingsoft Spreadsheets).

Si está escribiendo en CSV y visualizando a través de Excel, el CSV no almacena la máscara de formato y Excel mostrará el resultado como un número usando su formato predeterminado (científico para valores más grandes) ... siempre verifique cualquier CSV usando un editor de texto

Intenté exportar el archivo usando "# 0" como formato de columna, pero convierte el último dígito a 0. Si @ es el identificador del 'predeterminado', ¿cómo puedo enumerar la celda como solo texto para que Excel no toque nada? ?

Actualmente, mi solución es exportar desde laravel-excel como csv y luego estoy usando un script de Python que escribí para exportar como xlsx, ya que openpyxl parece poder formatear como texto correctamente.

¿Hay alguna solución para este comportamiento? Estoy exportando a XSLX desde una matriz donde tengo cadenas como "10E00" que se exportan como número "10" en Excel. setColumnFormat "@" no funciona para mí ...

@lachyn Nunca terminé encontrando una buena solución, como dije anteriormente, la solución que terminé usando fue exportar como desde laravel CSV y luego ejecutar un comando de shell para convertir la salida a xlsx con un script de Python.

@lszanto, pero esto es extraño, incluso si lo exporto a "CSV", tengo el valor "10" en lugar de "10E00", y estoy seguro de que en mi matriz está la cadena "10E00" ....

@lachyn ¿

Si lo desea y los datos no son privados, puede publicar una muestra y lo intentaré cuando tenga la oportunidad.

@lszanto sublime editor de texto ...
Estoy haciendo una consulta con toArray () al final. Si vuelco esta matriz, es con "10E00", después de exportar ... "10". La exportación se realiza desde esta matriz, por lo que todos los mutadores se realizan en consulta ... Por lo tanto, debe cambiarse durante la exportación.

@lszanto probablemente encontré la causa de este problema. Si elimino la fila de encabezado de mi exportación

  $sheet->prependRow(..)

ahora está funcionando como se esperaba ... así que probablemente esta función de alguna manera rompe el formato. Intenté generar una hoja desde el modelo o desde la matriz, los mismos resultados.

Excel::create('sklad_vyrobku-'.date('d-m-Y', time()), function($excel) use ($table) {
            $excel->sheet('Sklad vyrobku k '.date('d-m-Y', time()), function($sheet) use ($table) {                                         
                 $sheet->fromModel($table, null, 'A1', false, false);
                     $sheet->prependRow(array('id','kod','...'));
                 $sheet->setColumnFormat(array('B'=>'@','C'=>'@','D'=>'@','E'=>'@'));
            });
         })->download('xlsx');

Tuve el mismo problema (Laravel 4.2), pero lo resolví llamando a setColumnFormat inmediatamente después de abrir $ excel-> cierre de la función de hoja.
Entonces no creo que esto sea un error, solo un enfoque lógico.

Ejemplo:

$excel->sheet("FooBar", function($sheet) use ($x, $y, $z) {

    $sheet->setColumnFormat(array(
       "G:H" => "@",
       "Z" => "@",
       'AH:AI' => '0',
       "AO:BB" => "h:mm",
       "BE:BR" => "h:mm",
    ));

    ...

});

Todavía tenía este problema y ninguna de las soluciones anteriores funcionó para mí. Estaba importando mis datos de una matriz y aunque todos los valores allí eran strings , estaba pensando que setColumnFormat todavía haría su trabajo y convertiría las celdas en Number Format , aunque ese no fue el caso.
La forma en que lo resolví es encasillando todos los valores de mi matriz en flotantes / ints antes de usar el método fromArray para importar los datos a la hoja.

Entonces, si nada funciona para usted, asegúrese de que los datos que está importando sean del tipo correcto antes de insertarlos en la hoja. Espero que esto ayude a alguien :)

Encontré una solución al usar setCellValueExplicit ()
p.ej:

$sheet->setColumnFormat(array( //se formatea la columna a texto
    'C' => \PHPExcel_Style_NumberFormat::FORMAT_TEXT,
    'I' => 'dd-mm-yyyy hh:mm'
));

$sheet->setCellValueExplicit('C10', $object->card_number, \PHPExcel_Cell_DataType::TYPE_STRING);

Espero que esto ayude ;)

$ excel-> hoja ('personal', función ($ hoja) use ($ datos) {
$ hoja-> setColumnFormat (matriz (
'H' => '@',
));
$ hoja-> filas ($ datos, verdadero);
});

Espero que esto ayude ;)

Sigo con el mismo problema. De hecho, cambia el formato (fuente) pero no el formato de los datos.
captura de pantalla 2017-04-04 a las 11 11 39 a m
captura de pantalla 2017-04-04 a las 11 05 19 a m
captura de pantalla 2017-04-04 a las 11 12 58 a m

¿Es un error o lo estoy haciendo de manera incorrecta?

@minkadev
$sheet->rows($data, true) agrega todas las reglas "explícitas". Esto significa que se agregará como una cadena y, por lo tanto, se ignorará el formato de la columna.

Gracias @patrickbrouwers.
También intento con:

$sheet->fromArray($data, null, 'A1', false, false);

Creo que encontré por qué no funciona, no estoy seguro de por qué se agregó: https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Classes/LaravelExcelWorksheet.php#L1262 It también agrega números y enteros como valores de "cadena".

¿Entonces no funcionará? :(

Simplemente no establezca explícito $sheet->rows($data, true); en verdadero.

Usar:

$sheet->rows($data);

$sheet->fromArray($data, null, 'A1', false, false); también me funciona bien.

Sigue sin funcionar. Además, ¿cómo puedo formatear columnas usando:
$sheet->fromArray($data, null, 'A1', false, false);

Su código de ejemplo con $sheet->rows($data); funciona bien para mí. El formato de columna es correcto cuando lo abro en Excel.

Eso es raro. Sigue sin funcionar:
captura de pantalla 2017-04-05 a las 11 15 20 a m
captura de pantalla 2017-04-05 a las 11 13 48 a m
¿Tengo la versión correcta? (v2.1.16)

¿Alguien? ... sigo teniendo este problema ...

En Laravel 5.3, maatwebsite / excel 2.1.12

Pude hacerlo funcionar con los siguientes dos cambios

  1. @LastxTemplar sugerencia de
  2. colocando setColumnFormat () inmediatamente después de abrir $ excel-> cierre de la función de hoja, por @ nikola-absolute

Tengo este problema recientemente, intento usar el método setColumnFormat pero no me funciona.
Esta es mi solución:

foreach (...) {
    $sheet->row($row, [
        /* Your Data */
    ]);
    $sheet->setCellValueExplicitByColumnAndRow($column, $row, $value, \PHPExcel_Cell_DataType::TYPE_STRING);
}

Tenga en cuenta que el tipo de $column y $row es integer , consulte aquí .

En Laravel 5.1, maatwebsite / excel 2.1.0
Pude hacer que funcionara solo lanzando el número a un flotante o int
:(
Así que tengo que recorrer cada fila para lograrlo.

También experimentando este problema. ¿Se avecinan actualizaciones?

Editar: solo se ha solucionado también con la solución alternativa de @ vecindario999

Todas las muestras aquí están hablando de exportar a Excel,¿Qué tal la importación de muestras de Excel?

valor-> imei_1 = 356803081142590;

pero termino obteniendo imei_1 como "3.5680308104231E + 14"

<?php

$path = $request->file('excel')->getRealPath();
$data = Excel::load($path, function ($reader) {
})->get(['brand', 'model', 'batch', 'imei_1', 'imei_2']);

if (!empty($data) && $total = $data->count()) {
    foreach ($data as $key => $value) {
              $insert[] = ['brand' => $value->brand,
                           'model' => $value->model,
                           'batch' => $request->batch ? $request->batch : $value->batch,
                           'imei_1' => strval($value->imei_1),
                           'imei_2' => strval($value->imei_2),
                           'created_at' => Carbon::now(),
                           'updated_at' => Carbon::now()
                         ];
        }
    /*if (!empty($insert)) {
        Device::insert($insert);
        // dd('Insert Record successfully.');
    }*/
}

@ Ra1da35ma Tengo el mismo problema. ¿Haz alcanzado algo con esto?

Intenté configurar un enlazador de valores personalizado, pero eso no funciona porque los valores que se enlazan a las celdas ya están en notación científica. Puedo abrir otro problema para intentar resolverlo, ya que no es estrictamente el mismo problema, pero espero que tenga más información.

He encontrado una solución. El problema tenía que ver con PHP y su variable .ini de precisión que es leída por la clase PHPExcel_Calculation. No puede anular esto en el paquete Laravel-Excel ni realmente en su paquete padre PHPExcel. En cambio, para solucionar esto, acabo de agregar ini_set('precision', 20) antes de llamar a la función de carga de Excel.

Esta es mi función:

public function getXlsxFile($filePath)
    {
        ini_set('precision', 18);
        $collection = Excel::load($filePath);

        return $collection->get();
    }

Así es como me funciona con laravel 5.1

$ myFile = Excel :: create ($ nombre de archivo, función ($ excel) use ($ matriz) {
$ excel-> setTitle ('título');
$ excel-> hoja ('hoja 1', función ($ hoja) use ($ matriz) {
$ hoja-> setColumnFormat (matriz ('B' => '0'));
$ hoja-> setColumnFormat (matriz ('C' => '0'));
$ hoja-> setColumnFormat (matriz ('D' => '0'));
$ hoja-> setColumnFormat (matriz ('E' => '0'));
$ hoja-> filas ($ matriz, falso);
// establecer nombres de columnas
$ hoja-> prependRow (matriz (
'Nombre de columna 1', 'Casilla 1', 'Casilla 2', 'Casilla 3', 'Total'
));
});
});

Estamos cerrando todas las entradas antiguas, porque la versión 2. * está llegando al final de su vida útil. Ahora dedicamos toda nuestra atención a la versión 3.0. Todavía es posible usar 2. *, pero ya no habrá soporte activo.

Conversión de valor a número entero funcionó para mí.

Esta es la mejor respuesta, escriba emitir sus variables en la matriz antes de pasarlas al método ->fromArray : p.
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

¿Fue útil esta página
0 / 5 - 0 calificaciones