Laravel-excel: [BUG] EXCEL importieren tritt bei PHP7.4 als Ausnahme auf. Antwort: Es wird versucht, auf den Array-Offset für den Wert vom Typ int zuzugreifen

Erstellt am 5. Dez. 2019  ·  24Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Versionen

  • PHP-Version: PHP7.4 (Centos7 yum installiert php74 form remisrepo stabile Version)
  • Laravel-Version: Laravel Framework 5.8.35
  • Paketversion: maatwebsite / excel 3.1.17

Beschreibung

Import EXCEL passiert Ausnahme bei PHP7.4,
Ausnahme-> message () ist:
Versuch, auf den Array-Offset für den Wert vom Typ int zuzugreifen.

Schritte zum Reproduzieren

Erwartetes Verhalten:

Importieren Sie eine XLSX-Datei, während ich den Code auf PHP72W ausführe

Tatsächliches Verhalten:
passiert, nachdem ich meinen Server-Umstand von PHP7.2 auf PHP7.4 hochgeladen habe, als ich ein Excel importierte, würde wie oben fehlschlagen.

wäre wieder normal wenn ich von php7.4 auf php7.2 downgraden würde.

zusätzliche Information

$extension=$request->file()['file']->getClientOriginalExtension();
$extension[0] = strtoupper($extension[0]);
Excel::import(new RejectedImport(), $request->file()['file']->path(),null,$extension);

Und was ist in der Importklasse:

<?php

namespace App\Imports;

use App\Commodity;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class CommodityImport implements ToCollection, WithHeadingRow
{
    protected $isOverride=false;
    public function __construct($isOverride)
    {
        if($isOverride=='1')
            $this->isOverride=true;
    }

    /**
     * <strong i="26">@param</strong> Collection $collections
     */
    public function collection(Collection $collections)
    {
        foreach ($collections as $row)
        {
            $barcode = $row['barcode'] ?? $row['BARCODE'] ?? $row['Barcode'];
            if(!$barcode)continue;
            $name = $row['name'] ?? $row['NAME'] ?? $row['Name'] ?? '';
            $sku = $row['sku'] ?? $row['SKU'] ?? $row['Sku'] ?? '';
            $owner = $row['owner'] ?? $row['owner_name'] ?? $row['OWNER'] ?? $row['Owner'] ?? '';
            $commodity=Commodity::where('barcode',$row['barcode'])->first();
            if($commodity){
                if($this->isOverride){
                    $name?$commodity['name']= $name:false;
                    $sku?$commodity['sku']= $sku:false;
                    $owner?$commodity['owner_name']= $owner:false;
                    $commodity->update();
                }
            }else{
                Commodity::create([
                    'name' => $name,
                    'sku' => $sku,
                    'owner_name' => $owner,
                    'barcode' => $barcode,
                ]);
            }
        }
    }
}
bug

Hilfreichster Kommentar

Ersetzen Sie in der PHPExcel-Datei "DefaultValueBinder.php" diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Dadurch wird der Fehler "Versuch, auf Array-Offset bei Wert vom Typ int zuzugreifen" behoben. Sie müssen jedoch auch im gesamten PHPExcel-Code nach geschweiften Klammern suchen und diese ersetzen, um den Fehler "Array- und String-Offset-Zugriffssyntax mit geschweiften Klammern ist veraltet" zu beheben, der sich auch auf PHP-Ugraden bis 7.4 auswirkt. Ich habe sie einfach überall durch "[" und "]" ersetzt und alles funktioniert wieder einwandfrei.

Alle 24 Kommentare

Vielen Dank für die Übermittlung des Tickets. Leider sind die von Ihnen angegebenen Informationen unvollständig. Wir müssen wissen, welche Version Sie verwenden und wie Sie sie reproduzieren können. Bitte geben Sie Codebeispiele an. Bevor wir es abholen können, überprüfen Sie bitte (https://github.com/Maatwebsite/Laravel-Excel/blob/3.1/.github/ISSUE_TEMPLATE.md) und fügen Sie die fehlenden Informationen hinzu. Um die Bearbeitung dieses Tickets erheblich zu vereinfachen, überprüfen Sie bitte (https://laravel-excel.maatwebsite.nl/3.1/getting-started/contributing.html) und überprüfen Sie noch einmal, ob Sie die Ausgabevorlage ausgefüllt haben korrekt. Auf diese Weise können wir Ihr Ticket effizienter abholen. Probleme, die den Richtlinien korrekt folgen, haben Vorrang vor anderen Problemen.

Können Sie etwas mehr Stacktrace zeigen, kann ich den Fehler bei Verwendung des Pakets auf PHP7.4 nicht bestätigen. Vielleicht ist es etwas in Ihrem eigenen Code?

Hallo @patrickbrouwers, danke für das Paket, ich bin ein großer Fan davon!

Nach dem Upgrade wird ein ähnlicher Fehler angezeigt, obwohl er während eines Exports ausgeführt wird. Der Stacktrace zeigt an, dass das Problem bei phpsreadsheet liegt, nicht bei Laravel-Excel, aber Google hat mich hierher gebracht.

Hier ist die Stapelverfolgung:

#0 /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php(56): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError()
#1 /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php(34): PhpOffice\\PhpSpreadsheet\\Cell\\DefaultValueBinder::dataTypeForValue()
#2 /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php(184): PhpOffice\\PhpSpreadsheet\\Cell\\DefaultValueBinder->bindValue()
#3 /vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php(2510): PhpOffice\\PhpSpreadsheet\\Cell\\Cell->setValue()
#4 /vendor/maatwebsite/excel/src/Sheet.php(402): PhpOffice\\PhpSpreadsheet\\Worksheet\\Worksheet->fromArray()
#5 /vendor/maatwebsite/excel/src/Sheet.php(502): Maatwebsite\\Excel\\Sheet->append()
#6 /vendor/maatwebsite/excel/src/Sheet.php(368): Maatwebsite\\Excel\\Sheet->appendRows()
#7 /vendor/maatwebsite/excel/src/Sheet.php(195): Maatwebsite\\Excel\\Sheet->fromCollection()
#8 /vendor/maatwebsite/excel/src/Writer.php(73): Maatwebsite\\Excel\\Sheet->export()
#9 /vendor/maatwebsite/excel/src/Excel.php(176): Maatwebsite\\Excel\\Writer->export()
#10 /vendor/maatwebsite/excel/src/Excel.php(97): Maatwebsite\\Excel\\Excel->export()
#11 /app/Console/Commands/EmailCardRequestList.php(89): Maatwebsite\\Excel\\Excel->store()

Ersetzen Sie in der PHPExcel-Datei "DefaultValueBinder.php" diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Dadurch wird der Fehler "Versuch, auf Array-Offset bei Wert vom Typ int zuzugreifen" behoben. Sie müssen jedoch auch im gesamten PHPExcel-Code nach geschweiften Klammern suchen und diese ersetzen, um den Fehler "Array- und String-Offset-Zugriffssyntax mit geschweiften Klammern ist veraltet" zu beheben, der sich auch auf PHP-Ugraden bis 7.4 auswirkt. Ich habe sie einfach überall durch "[" und "]" ersetzt und alles funktioniert wieder einwandfrei.

DefaultValueBinder.php im Herstellerordner? oder wo ist es selbes Problem hier.

DefaultValueBinder.php im Herstellerordner? oder wo ist es selbes Problem hier.

Entschuldigen Sie. Ich hätte genauer sein sollen. In meiner Installation befindet es sich im Ordner PHPExcel an diesem Speicherort: PHPExcel \ Cell \ DefaultValueBinder.php
Dies kann von Ihrer Installation abweichen. Sie sollten jedoch in der Lage sein, auf Ihrem System danach zu suchen.

Die Linie, die ich denke, ist die 62, nicht die 82, mein Freund! und ich hoffe, dass es funktioniert, weil ich Stress habe. Ich kann die Fehlerlösung in meinem Projekt nicht finden: Fehler FEHLER: Es wurde versucht, auf den Array-Offset für den Wert vom Typ int '/ Cell / DefaultValueBinder zuzugreifen. PHP: 56 '. Ich habe große Hoffnungen!

Dies ist der Pfad: Drittanbieter / PHPExcel / Classes / PHPExcel / Cell / DefaultValueBinder.php
Hier bedeutet Drittanbieter, wo Sie Ihren PHPExcel-Ordner aufbewahrt haben

Suchen Sie nun === '=' und prüfen Sie, ob eine übereinstimmende Zeile vorhanden ist. Ersetzen Sie diese durch diese
0 === strpos ($ pValue, '=')
Ruhe wäre gleich. In meinem Fall war es
$ pValue [0] === '='

Ersetzen Sie in der PHPExcel-Datei "DefaultValueBinder.php" diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Dadurch wird der Fehler "Versuch, auf Array-Offset bei Wert vom Typ int zuzugreifen" behoben. Sie müssen jedoch auch im gesamten PHPExcel-Code nach geschweiften Klammern suchen und diese ersetzen, um den Fehler "Array- und String-Offset-Zugriffssyntax mit geschweiften Klammern ist veraltet" zu beheben, der sich auch auf PHP-Ugraden bis 7.4 auswirkt. Ich habe sie einfach überall durch "[" und "]" ersetzt und alles funktioniert wieder einwandfrei.

Es klappt! Ich liebe dich!

Ersetzen Sie in der PHPExcel-Datei "DefaultValueBinder.php" diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Dadurch wird der Fehler "Versuch, auf Array-Offset bei Wert vom Typ int zuzugreifen" behoben. Sie müssen jedoch auch im gesamten PHPExcel-Code nach geschweiften Klammern suchen und diese ersetzen, um den Fehler "Array- und String-Offset-Zugriffssyntax mit geschweiften Klammern ist veraltet" zu beheben, der sich auch auf PHP-Ugraden bis 7.4 auswirkt. Ich habe sie einfach überall durch "[" und "]" ersetzt und alles funktioniert wieder einwandfrei.

Als ich fast auf PHP 7.3 heruntergestuft habe, hat mir das geholfen

Haben Sie eine Idee, um dieses Problem mit PHP 7.4.3 & maatwebsite / excel Version 2.1 zu lösen?

Sie müssten das veraltete phpexcel-Paket gabeln und die Gabel selbst warten.

} elseif (0 === strpos($pValue, '=') && strlen($pValue) > 1) {

Strpos von Bool, Rly?

Fügen Sie diesen Code nach der Überprüfung einfach in is_bool und is_float ein

Code ist nicht Teil dieses Pakets, sondern Teil von PhpExcel

Ersetzen Sie in der PHPExcel-Datei "DefaultValueBinder.php" diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Dadurch wird der Fehler "Versuch, auf Array-Offset bei Wert vom Typ int zuzugreifen" behoben. Sie müssen jedoch auch im gesamten PHPExcel-Code nach geschweiften Klammern suchen und diese ersetzen, um den Fehler "Array- und String-Offset-Zugriffssyntax mit geschweiften Klammern ist veraltet" zu beheben, der sich auch auf PHP-Ugraden bis 7.4 auswirkt. Ich habe sie einfach überall durch "[" und "]" ersetzt und alles funktioniert wieder einwandfrei.

Danke mann. Liebte es. Thankx @burello <3

Am besten aktualisieren Sie die PHPOffice/PhpSpreadsheet über 1.10 in Ihrem Projekt - da dieser Fehler dann behoben wird, ohne dass die Paketcodebasis manuell bearbeitet werden muss. Also für mich

composer require phpoffice/phpspreadsheet "^1.10"

Das Problem wurde behoben.

Ich habe diesen Fehler auch

schon ahnungslos

Ersetzen Sie in der PHPExcel-Datei "DefaultValueBinder.php" diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Dadurch wird der Fehler "Versuch, auf Array-Offset bei Wert vom Typ int zuzugreifen" behoben. Sie müssen jedoch auch im gesamten PHPExcel-Code nach geschweiften Klammern suchen und diese ersetzen, um den Fehler "Array- und String-Offset-Zugriffssyntax mit geschweiften Klammern ist veraltet" zu beheben, der sich auch auf PHP-Ugraden bis 7.4 auswirkt. Ich habe sie einfach überall durch "[" und "]" ersetzt und alles funktioniert wieder einwandfrei.

Danke, dass du für mich gearbeitet hast !! orderimportexport.ocmod opencart 3x

Ersetzen Sie in der PHPExcel-Datei "DefaultValueBinder.php" diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Dadurch wird der Fehler "Versuch, auf Array-Offset bei Wert vom Typ int zuzugreifen" behoben. Sie müssen jedoch auch im gesamten PHPExcel-Code nach geschweiften Klammern suchen und diese ersetzen, um den Fehler "Array- und String-Offset-Zugriffssyntax mit geschweiften Klammern ist veraltet" zu beheben, der sich auch auf PHP-Ugraden bis 7.4 auswirkt. Ich habe sie einfach überall durch "[" und "]" ersetzt und alles funktioniert wieder einwandfrei.

Erstaunlich, du hast mich gerettet, Bruder, vielen Dank

Ersetzen Sie diese Zeile 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
mit den folgenden:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {

für mich arbeiten ...

image

Bitte melden Sie Fehler in PhpSpreadsheet an PhpSpreadsheet.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen