Laravel-excel: Laravel 4.2/Laravel-Excel 1.3: Als Text formatierte Zahlen werden immer noch als Zahl angezeigt

Erstellt am 3. Dez. 2015  ·  38Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Ich habe ein paar Tage damit herumgespielt, aber es funktioniert einfach nicht. Ich habe einige lange Zahlen (16 Ziffern) in meiner Datenbank gespeichert, die ich dann mit der Funktion toArray() verwende, um meine xlsx-Excel-Tabelle zu erstellen. Der Code, den ich verwende, um die Spalte zu formatieren:
$sheet->setColumnFormat(array( 'A' => '@' ));

Allerdings werden die Zahlen in Excel als Zahlen dargestellt und mit wissenschaftlicher Notation gekürzt.

Gibt es etwas, was ich dagegen tun kann, außer ein Leerzeichen auf beiden Seiten anzufügen?

Ich bin mir der 15-stelligen Begrenzung von Excel bewusst, aber bei der Formatierung als Text war ich der Meinung, dass dies kein Problem sein würde.

Hilfreichster Kommentar

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

Hoffe das hilft ;)

Alle 38 Kommentare

Gleiches Problem hier, jedoch in meinem Fall sind es 14-stellige Strings.

Wenn Sie wissenschaftliche Schreibweise für lange Zahlen in Excel vermeiden wollen, dann brauchen Sie eine Formatmaske zu setzen , die explizit diese Werte als Zahlen zeigt ..... mit @ einfach sagt MS Excel seine Standardverhalten zu verwenden (das heißt, für längere Zahlen das wissenschaftliche Format zu verwenden).... Ich schlage vor, Sie verwenden stattdessen eine Formatmaske von #0

Selbst dann funktioniert es nicht. Folgendes habe ich versucht: $sheet->setColumnFormat(['id'=> '#0']);. Ich vermute auch, dass setColumnFormat mit CSVs nicht so gut funktioniert, da ich eine Reihe von Formaten ausprobiert habe und es keinen wirklichen Einfluss auf das Spaltenformat hatte.

Ich weiß nicht, ob das einen Unterschied macht, aber ich habe $sheet->fromModel($result); und ich habe $sheet->fromArray($result->toArray()) ausprobiert und beide haben zu diesem Problem geführt.

Für diejenigen, die dieses Problem mit CSVs haben, habe ich die folgende Methode erstellt:

öffentliche Funktion getStringIdAttribute()
{
return '="' . $this->id . '"';
}
und oben in meinem Modell habe ich hinzugefügt:
geschützt $appends = ['string_id'];

und das zwang die Zahl in Excel (sowie Kingsoft Spreadsheets) als Text anzuzeigen.

Wenn Sie in CSV schreiben und über Excel anzeigen, speichert die CSV die Formatmaske nicht und Excel zeigt das Ergebnis als Zahl im Standardformat an (wissenschaftlich für größere Werte). .... überprüfen Sie immer jede CSV mit ein Texteditor

Ich habe versucht, die Datei mit "#0" als Spaltenformat zu exportieren, aber es konvertiert die letzte Ziffer in 0. Wenn @ der Bezeichner für den 'Standard' ist, wie kann ich die Zelle dann nur als Text auflisten, damit Excel nichts berührt? ?

Derzeit exportiere ich aus laravel-excel als csv und dann verwende ich ein Python-Skript, das ich geschrieben habe, um als xlsx zu exportieren, da openpyxl in der Lage zu sein scheint, korrekt als Text zu formatieren.

Gibt es eine Lösung für dieses Verhalten? Ich exportiere aus einem Array nach XSLX, wo ich Zeichenfolgen wie "10E00" habe, die in Excel als Nummer "10" exportiert werden. setColumnFormat "@" funktioniert bei mir nicht...

@lachyn Ich habe nie eine gute Lösung gefunden, wie ich oben sagte, die Problemumgehung, die ich verwendet habe, bestand darin, als aus laravel CSV zu exportieren und dann einen Shell-Befehl auszuführen, um die Ausgabe mit einem Python-Skript in xlsx zu konvertieren.

@lszanto, aber das ist seltsam, selbst wenn ich es in "CSV" exportiere, habe ich den Wert "10" anstelle von "10E00", und ich bin mir sicher, dass in meinem Array die Zeichenfolge "10E00" ist...

@lachyn Womit

Wenn Sie möchten und die Daten nicht privat sind, können Sie ein Beispiel posten und ich werde es bei Gelegenheit ausprobieren.

@lszanto erhabener Texteditor ...
Ich mache eine Abfrage mit toArray() am Ende. Wenn ich dieses Array speichere, ist es mit "10E00", nach dem Export ... "10". Der Export erfolgt aus diesem Array, also werden alle Mutatoren in der Abfrage ausgeführt.... Es muss also während des Exports geändert werden.

@lszanto wahrscheinlich habe ich die Ursache für dieses Problem gefunden. Wenn ich die Kopfzeile aus meinem Export entferne

  $sheet->prependRow(..)

es funktioniert jetzt wie erwartet .... also wahrscheinlich unterbricht diese Funktion irgendwie die Formatierung. Versucht, ein Blatt aus einem Modell oder einem Array zu generieren, gleiche Ergebnisse.

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

Ich hatte ein gleiches Problem (Laravel 4.2), aber gelöst, indem ich setColumnFormat sofort nach dem Öffnen von $excel->sheet Function Closure aufgerufen habe.
Ich denke also nicht, dass dies ein Fehler ist, sondern nur ein logischer Ansatz.

Beispiel:

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

    ...

});

Ich hatte immer noch dieses Problem und keine der oben genannten Lösungen hat bei mir funktioniert. Ich importierte meine Daten aus einem Array und während alle darin enthaltenen Werte strings , dachte ich, dass setColumnFormat immer noch seine Arbeit erledigen und die Zellen in Number Format umwandeln würde. das war aber nicht der fall.
Die Art und Weise, wie ich es gelöst habe, besteht darin, alle Werte in meinem Array in Floats / Ints umzuwandeln, bevor Sie die Methode fromArray verwenden, um die Daten in das Blatt zu importieren.

Wenn also nichts für Sie funktioniert, stellen Sie sicher, dass die Daten, die Sie importieren, den richtigen Typ haben, bevor Sie sie in das Blatt einfügen. Hoffe das hilft jemandem :)

Ich habe eine Problemumgehung gefunden, indem
z.B:

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

Hoffe das hilft ;)

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

Hoffe das hilft ;)

Ich habe immer noch das gleiche Problem. Tatsächlich ändert es das Format (Schriftart), aber nicht das Datenformat.
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

Ist das ein Bug oder mache ich es falsch?

@minkadev
$sheet->rows($data, true) fügt alle Regeln "explizit" hinzu. Dies bedeutet, dass es als String hinzugefügt wird und somit die Spaltenformatierung ignoriert wird.

Danke @patrickbrouwers.
Ich versuche es auch mit:

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

Ich glaube, ich habe herausgefunden, warum es nicht funktioniert, bin mir nicht sicher, warum es jemals hinzugefügt wurde: https://github.com/Maatwebsite/Laravel-Excel/blob/2.1/src/Maatwebsite/Excel/Classes/LaravelExcelWorksheet.php#L1262 It fügt auch numerische & ganze Zahlen als "String"-Werte hinzu.

Es wird also nicht funktionieren? :(

Setzen Sie nur nicht explizit $sheet->rows($data, true); auf true.

Verwenden:

$sheet->rows($data);

$sheet->fromArray($data, null, 'A1', false, false); funktioniert bei mir auch gut.

Funktioniert immer noch nicht. Außerdem, wie kann ich Spalten formatieren mit:
$sheet->fromArray($data, null, 'A1', false, false);

Ihr Beispielcode mit $sheet->rows($data); funktioniert bei mir einwandfrei. Die Spaltenformatierung ist korrekt, wenn ich sie in Excel öffne.

Das ist seltsam. Funktioniert immer noch nicht:
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
Ich habe die richtige Version? (v2.1.16)

Jemand?.. Ich habe dieses Problem immer noch...

In Laravel 5.3, maatwebsite/excel 2.1.12

Ich konnte es mit den folgenden zwei Änderungen zum Laufen bringen

  1. @LastxTemplar Vorschlag, die Zahl in einen Float oder int
  2. Platzieren von setColumnFormat() direkt nach dem Öffnen von $excel->Sheet Function Closure, per @nikola-absolute

Ich habe dieses Problem vor kurzem bekommen, ich versuche, die Methode setColumnFormat verwenden, funktioniert aber nicht für mich.
Das ist mein Workaround:

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

Hinweistyp von $column und $row ist integer , siehe hier .

In Laravel 5.1, maatwebsite/excel 2.1.0
Ich konnte es zum Laufen bringen, indem ich nur die Zahl in einen Float oder int umwandelte
:(
Also muss ich für jede Zeile eine Schleife machen, um das zu erreichen.

Habe auch dieses Problem. Kommen irgendwelche Updates?

Edit: gerade behoben ist auch mit dem Workaround von @neighborhood999

Alle Beispiele hier beziehen sich auf den Export nach Excel,Wie wäre es mit dem Import aus Excel-Beispielen?

Wert -> imei_1 = 356803081142590;

aber am Ende bekomme ich imei_1 als "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 Ich habe das gleiche Problem. Bist du damit irgendwo hingekommen?

Ich habe versucht, einen benutzerdefinierten Wertbinder festzulegen, aber das funktioniert nicht, da die an Zellen gebundenen Werte bereits in wissenschaftlicher Notation vorliegen. Ich kann ein anderes Problem eröffnen, um zu versuchen, dieses Problem zu lösen, da es sich nicht genau um das gleiche Problem handelt, aber hoffentlich haben Sie weitere Informationen.

Ich habe eine Lösung gefunden. Das Problem hatte mit PHP und seiner präzisen .ini-Variablen zu tun, die von der PHPExcel_Calculation-Klasse gelesen wird. Sie können dies weder im Laravel-Excel Paket noch wirklich im übergeordneten Paket PHPExcel überschreiben. Um dies zu beheben, habe ich einfach ini_set('precision', 20) hinzugefügt, bevor ich die Excel-Ladefunktion aufgerufen habe.

Das ist meine Funktion:

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

        return $collection->get();
    }

So funktioniert es bei mir mit laravel 5.1

$myFile= Excel::create($filename, function($excel) use($array) {
$excel->setTitle('Titel');
$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);
//Spaltennamen setzen
$sheet->prependRow(array(
„Spaltenname 1“, „Feld 1“, „Feld 2“, „Feld 3“, „Gesamt“
));
});
});

Wir schließen alle alten Tickets, da Version 2.* das End-of-Life Stadium erreicht. Unsere volle Aufmerksamkeit gilt nun der Version 3.0. Es ist weiterhin möglich 2.* zu verwenden, aber es wird keinen aktiven Support mehr geben.

Das Umwandeln des Werts in eine ganze Zahl hat bei mir funktioniert.

Dies ist die beste Antwort, geben Sie Ihre Variablen in das Array um, bevor Sie sie an die Methode ->fromArray : zB
$local_order['Quantity'] = (int) $item->quantity;
$local_order['Price'] = (float) $item->price;

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

bahmanyaghoobi picture bahmanyaghoobi  ·  3Kommentare

ellej16 picture ellej16  ·  3Kommentare

amine8ghandi8amine picture amine8ghandi8amine  ·  3Kommentare

matthewslouismarie picture matthewslouismarie  ·  3Kommentare

rossjcooper picture rossjcooper  ·  3Kommentare