Laravel-excel: Laravel 4.2/Laravel-Excel 1.3 : Les nombres formatés sous forme de texte apparaissent toujours sous forme de nombre

Créé le 3 déc. 2015  ·  38Commentaires  ·  Source: Maatwebsite/Laravel-Excel

Je joue avec ça depuis quelques jours mais je n'arrive tout simplement pas à le faire fonctionner. J'ai de longs nombres (16 chiffres) stockés dans ma base de données que j'utilise ensuite la fonction toArray() pour créer ma feuille de calcul xlsx excel. Le code que j'utilise pour formater la colonne :
$sheet->setColumnFormat(array( 'A' => '@' ));

Cependant, les nombres sont affichés dans Excel sous forme de nombres et ils sont raccourcis avec une notation scientifique.

Y a-t-il quelque chose que je puisse faire à ce sujet en dehors d'ajouter un espace de chaque côté ?

Je suis conscient de la limite de 15 chiffres d'Excel, mais lors du formatage en tant que texte, j'ai été amené à croire que ce ne serait pas un problème.

Commentaire le plus utile

$excel->sheet('staff', function ($sheet) use ($data) {
$sheet->setColumnFormat(array(
'H' => '@',
));
$sheet->rows($data,true);
});

J'espère que cela t'aides ;)

Tous les 38 commentaires

Même problème ici, mais dans mon cas, il s'agit de chaînes à 14 chiffres.

Si vous souhaitez éviter la notation scientifique pour les nombres longs dans Excel, vous devez définir un masque de format qui affiche explicitement ces valeurs sous forme de nombres ..... utiliser @ indique simplement à MS Excel d'utiliser son comportement par défaut (qui consiste à utiliser un format scientifique pour les nombres plus longs).... Je vous suggère d'utiliser un masque de format de #0 place

Même là, ça ne marche pas. C'est ce que j'ai essayé : $sheet->setColumnFormat(['id'=> '#0']);. Je soupçonne également que setColumnFormat ne fonctionne pas aussi bien avec les fichiers CSV car j'ai essayé un certain nombre de formats et cela n'a pas vraiment eu d'effet sur le format de colonne.

Je ne sais pas si cela fait une différence, cependant, j'utilise $sheet->fromModel($result); et j'ai essayé $sheet->fromArray($result->toArray()) et ils ont tous deux entraîné ce problème.

Pour ceux qui ont ce problème avec les CSV, j'ai créé la méthode suivante :

fonction publique getStringIdAttribute()
{
return '="' . $this->id . '"';
}
et en haut de mon modèle j'ai ajouté :
protected $appends = ['string_id'];

et cela a forcé le nombre à être affiché sous forme de texte dans Excel (ainsi que dans les feuilles de calcul Kingsoft).

Si vous écrivez au format CSV et visualisez via Excel, le CSV ne stocke pas le masque de format et Excel affichera le résultat sous forme de nombre en utilisant son format par défaut (scientifique pour les plus grandes valeurs)..... toujours vérifier tout CSV en utilisant un éditeur de texte

J'ai essayé d'exporter le fichier en utilisant "#0" comme format de colonne mais il convertit le dernier chiffre en 0. Si @ est l'identifiant du "par défaut", comment puis-je répertorier la cellule en tant que texte afin qu'Excel ne touche à rien ?

Actuellement, ma solution de contournement consiste à exporter à partir de laravel-excel en tant que csv, puis j'utilise un script python que j'ai écrit pour exporter en tant que xlsx car openpyxl semble pouvoir formater correctement en tant que texte.

Existe-t-il un correctif pour ce comportement? J'exporte vers XSLX à partir d'un tableau où j'ai des chaînes comme "10E00" qui sont exportées sous le numéro "10" dans Excel. setColumnFormat "@" ne fonctionne pas pour moi...

@lachyn Je n'ai jamais fini par trouver une bonne solution, comme je l'ai dit ci-dessus, la solution de contournement que j'ai finie par utiliser consistait à exporter en tant que CSV à partir de laravel, puis à exécuter une commande shell pour convertir la sortie en xlsx avec un script python.

@lszanto mais c'est étrange, même si je l'exporte vers "CSV", j'ai la valeur "10" au lieu de "10E00", et je suis sûr que dans mon tableau se trouve la chaîne "10E00"....

@lacyn Avec quoi

Si vous le souhaitez et que les données ne sont pas privées, vous pouvez poster un échantillon et je l'essaierai dès que j'en aurai l'occasion.

@lszanto sublime éditeur de texte...
Je fais une requête avec toArray() à la fin. Si je vide ce tableau, c'est avec "10E00", après exportation... "10". L'export se fait à partir de ce tableau, donc tous les mutateurs se font en requête... Il faut donc le changer lors de l'export.

@lszanto j'ai probablement trouvé la cause de ce problème. Si je supprime la ligne d'en-tête de mon exportation

  $sheet->prependRow(..)

cela fonctionne maintenant comme prévu... donc probablement cette fonction casse en quelque sorte le formatage. J'ai essayé de générer une feuille à partir d'un modèle ou d'un tableau, mêmes résultats.

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');

J'ai eu le même problème (Laravel 4.2), mais résolu en appelant setColumnFormat immédiatement après l'ouverture de la fonction $ excel->sheet.
Donc je ne pense pas que ce soit un bug, juste une approche logique.

Exemple:

$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",
    ));

    ...

});

J'avais toujours ce problème et aucune des solutions ci-dessus n'a fonctionné pour moi. J'importais mes données à partir d'un tableau et alors que toutes les valeurs y étaient strings , je pensais que setColumnFormat ferait toujours son travail et convertirait les cellules en Number Format , ce n'était pourtant pas le cas.
La façon dont je l'ai résolu est de convertir toutes les valeurs de mon tableau en floats/ints avant d'utiliser la méthode fromArray pour importer les données dans la feuille.

Donc, si rien ne fonctionne pour vous, assurez-vous que les données que vous importez sont du bon type avant de les insérer dans la feuille. J'espère que cela aidera quelqu'un :)

J'ai trouvé une solution de contournement en utilisant setCellValueExplicit()
par exemple:

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

J'espère que cela t'aides ;)

$excel->sheet('staff', function ($sheet) use ($data) {
$sheet->setColumnFormat(array(
'H' => '@',
));
$sheet->rows($data,true);
});

J'espère que cela t'aides ;)

Im toujours avec le même problème. En fait, il change le format (police) mais pas le format des données.
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

Est-ce un bug ou je le fais dans le mauvais sens ?

@minkadev
$sheet->rows($data, true) ajoute toutes les règles "explicites". Cela signifie qu'il sera ajouté en tant que chaîne et que le formatage des colonnes sera donc ignoré.

Merci @patrickbrouwers.
J'essaye aussi avec :

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

Je pense avoir trouvé pourquoi cela ne fonctionne pas, je ne sais pas pourquoi cela a déjà été ajouté : https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Classes/LaravelExcelWorksheet.php#L1262 Il ajoute également des valeurs numériques et entières en tant que valeurs "chaîne".

Donc ça ne marchera pas ? :(

Ne définissez pas explicitement $sheet->rows($data, true); sur true.

Utilisation:

$sheet->rows($data);

$sheet->fromArray($data, null, 'A1', false, false); fonctionne bien pour moi aussi.

Ne fonctionne toujours pas. De plus, comment puis-je formater des colonnes en utilisant :
$sheet->fromArray($data, null, 'A1', false, false);

Votre exemple de code avec $sheet->rows($data); fonctionne bien pour moi. La mise en forme des colonnes est correcte lorsque je l'ouvre dans Excel.

C'est bizarre. Ne fonctionne toujours pas:
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
J'ai la bonne version ? (v2.1.16)

Quelqu'un?.. J'ai toujours ce problème...

Dans Laravel 5.3, maatwebsite/excel 2.1.12

J'ai pu le faire fonctionner avec les deux changements suivants

  1. @LastxTemplar suggestion de
  2. placer le setColumnFormat () immédiatement après l'ouverture de la fonction $ excel->sheet, par @nikola-absolute

J'ai eu ce problème récemment, j'essaie d'utiliser la méthode setColumnFormat mais cela ne fonctionne pas pour moi.
Voici ma solution de contournement :

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

Le type de note $column et $row est integer , référence ici .

Dans Laravel 5.1, maatwebsite/excel 2.1.0
J'ai pu le faire fonctionner uniquement en transférant le nombre à un flottant ou à un int
:(
Je dois donc boucler pour chaque ligne pour y parvenir.

Connaissant également ce problème. Des mises à jour sont à venir ?

Edit: juste corrigé est également avec la solution de contournement de @neighborhood999

Tous les exemples ici parlent d'exporter vers Excel,Que diriez-vous d'importer à partir d'échantillons Excel

valeur->imei_1 = 356803081142590 ;

mais je finis par obtenir imei_1 comme "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 J'ai le même problème. Êtes-vous allé quelque part avec ça?

J'ai essayé de définir un classeur de valeurs personnalisé, mais cela ne fonctionne pas car les valeurs liées aux cellules sont déjà en notation scientifique. Je peux ouvrir un autre problème pour essayer de résoudre ce problème car ce n'est pas strictement le même problème, mais j'espère que vous avez plus d'informations.

J'ai trouvé un correctif. Le problème était lié à PHP et à sa variable de précision .ini qui est lue par la classe PHPExcel_Calculation. Vous ne pouvez pas surcharger cela dans le package Laravel-Excel ni vraiment dans son package parent PHPExcel. Au lieu de cela, pour résoudre ce problème, je viens d'ajouter ini_set('precision', 20) avant d'appeler la fonction de chargement Excel.

C'est ma fonction :

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

        return $collection->get();
    }

C'est comme ça que ça marche pour moi avec laravel 5.1

$myFile= Excel::create($filename, function($excel) use($array) {
$excel->setTitle('titre');
$excel->sheet('sheet 1', function($sheet) use($array) {
$sheet->setColumnFormat(array('B'=>'0'));
$sheet->setColumnFormat(array('C'=>'0'));
$sheet->setColumnFormat(array('D'=>'0'));
$sheet->setColumnFormat(array('E'=>'0'));
$sheet->rows($array,false);
//définir les noms des colonnes
$sheet->prependRow(array(
'Nom de la colonne 1', 'Boîte 1','Boîte 2','Boîte 3','Total'
));
});
});

Nous fermons tous les anciens tickets, car la version 2.* atteint le stade de la fin de vie. Toute notre attention est désormais consacrée à la version 3.0. Il est toujours possible d'utiliser 2.*, mais il n'y aura plus de support actif.

La valeur de coulée en nombre entier a fonctionné pour moi.

C'est la meilleure réponse, tapez cast vos variables dans le tableau avant de les passer à la méthode ->fromArray : par exemple
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

Cette page vous a été utile?
0 / 5 - 0 notes