Laravel-excel: [BUG] L'importation EXCEL se produit une exception à PHP7.4, réponse: Tentative d'accès au décalage du tableau sur la valeur de type int

Créé le 5 déc. 2019  ·  24Commentaires  ·  Source: Maatwebsite/Laravel-Excel

Versions

  • Version PHP: PHP7.4 (Centos7 yum installé php74 sous forme de version stable remisrepo)
  • Version Laravel: Framework Laravel 5.8.35
  • Version du paquet: maatwebsite / excel 3.1.17

La description

Import EXCEL se produit exception à PHP7.4,
Exception-> message () est:
Tentative d'accès au décalage du tableau sur la valeur de type int.

Étapes à suivre pour reproduire

Comportement prévisible:

importer un fichier xlsx lorsque j'exécute le code sur php72w

Comportement réel:
arrivé après que j'ai téléchargé ma situation de serveur de php7.2 à php7.4 lorsque j'importe un Excel échouerait comme ci-dessus.

serait à nouveau normal si je rétrograde de php7.4 à php7.2.

Informations Complémentaires

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

Et ce qu'il y a dans la classe d'importation:

<?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

Commentaire le plus utile

Dans le fichier PHPExcel "DefaultValueBinder.php", remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Cela corrigera l'erreur «Essayer d'accéder au décalage du tableau sur la valeur de type int». Mais vous devrez également effectuer une recherche et un remplacement pour les accolades dans tout le code PHPExcel pour résoudre l'erreur «La syntaxe d'accès au tableau et au décalage de chaîne avec accolades est obsolète» qui affecte également les mises à niveau de PHP vers la version 7.4. Je les ai simplement remplacés par "[" et "]" partout et tout fonctionne à nouveau correctement.

Tous les 24 commentaires

Merci d'avoir soumis le ticket. Malheureusement, les informations que vous avez fournies sont incomplètes. Nous avons besoin de savoir quelle version vous utilisez et comment la reproduire. Veuillez inclure des exemples de code. Avant de pouvoir le récupérer, veuillez vérifier (https://github.com/Maatwebsite/Laravel-Excel/blob/3.1/.github/ISSUE_TEMPLATE.md) et ajouter les informations manquantes. Pour faciliter le traitement de ce ticket, assurez-vous de vérifier (https://laravel-excel.maatwebsite.nl/3.1/getting-started/contributing.html) et de vérifier si vous avez rempli le modèle de problème correctement. Cela nous permettra de récupérer votre billet plus efficacement. Les problèmes qui suivent correctement les directives auront la priorité sur les autres problèmes.

Pouvez-vous montrer un peu plus de stacktrace, je ne peux pas confirmer le bogue lors de l'utilisation du paquet sur PHP7.4. C'est peut-être quelque chose dans votre propre code?

Salut @patrickbrouwers merci pour le package, j'en suis un grand fan!

J'obtiens une erreur similaire après la mise à niveau, bien que ce soit lors d'une exportation, et le stacktrace indique que le problème vient de phpsreadsheet, pas de Laravel-Excel, mais Google m'a amené ici.

Voici le stacktrace:

#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()

Corrigé dans PhpSpreadsheet, voir https://github.com/PHPOffice/PhpSpreadsheet/issues/1300

Dans le fichier PHPExcel "DefaultValueBinder.php", remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Cela corrigera l'erreur «Essayer d'accéder au décalage du tableau sur la valeur de type int». Mais vous devrez également effectuer une recherche et un remplacement pour les accolades dans tout le code PHPExcel pour résoudre l'erreur «La syntaxe d'accès au tableau et au décalage de chaîne avec accolades est obsolète» qui affecte également les mises à niveau de PHP vers la version 7.4. Je les ai simplement remplacés par "[" et "]" partout et tout fonctionne à nouveau correctement.

DefaultValueBinder.php dans le dossier du fournisseur? ou où est-il? Même problème ici.

DefaultValueBinder.php dans le dossier du fournisseur? ou où est-il? Même problème ici.

Mes excuses. J'aurais dû être plus précis. Dans mon installation, il se trouve dans le dossier PHPExcel à cet emplacement: PHPExcel \ Cell \ DefaultValueBinder.php
Cela peut différer de votre installation. Mais vous devriez pouvoir lancer une recherche sur votre système.

la ligne que je pense est le 62, pas 82 mon ami! et j'espère que cela fonctionnera parce que je suis stressé. Je ne trouve pas la solution à l'erreur dans mon projet: Erreur ERREUR: Essayer d'accéder au décalage du tableau sur la valeur de type int '/ Cell / DefaultValueBinder. php: 56 '. J'ai de grands espoirs!

Voici le chemin: third_party / PHPExcel / Classes / PHPExcel / Cell / DefaultValueBinder.php
Ici troisième_partie signifie où vous avez conservé votre dossier PHPExcel

Maintenant, recherchez === '=' et vérifiez s'il y a une ligne correspondante, puis remplacez-la par celle-ci à
0 === strpos ($ pValeur, '=')
Le repos serait le même. Dans mon cas, c'était
$ pValue [0] === '='

Dans le fichier PHPExcel "DefaultValueBinder.php", remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Cela corrigera l'erreur «Essayer d'accéder au décalage du tableau sur la valeur de type int». Mais vous devrez également effectuer une recherche et un remplacement pour les accolades dans tout le code PHPExcel pour résoudre l'erreur «La syntaxe d'accès au tableau et au décalage de chaîne avec accolades est obsolète» qui affecte également les mises à niveau de PHP vers la version 7.4. Je les ai simplement remplacés par "[" et "]" partout et tout fonctionne à nouveau correctement.

Ça marche! je t'aime!

Dans le fichier PHPExcel "DefaultValueBinder.php", remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Cela corrigera l'erreur «Essayer d'accéder au décalage du tableau sur la valeur de type int». Mais vous devrez également effectuer une recherche et un remplacement pour les accolades dans tout le code PHPExcel pour résoudre l'erreur «La syntaxe d'accès au tableau et au décalage de chaîne avec accolades est obsolète» qui affecte également les mises à niveau de PHP vers la version 7.4. Je les ai simplement remplacés par "[" et "]" partout et tout fonctionne à nouveau correctement.

Quand j'étais presque rétrogradé vers PHP 7.3, merci mec, cela m'a aidé

Une idée pour résoudre ce problème avec PHP 7.4.3 et maatwebsite / excel version 2.1?

Vous devrez créer un fork du package phpexcel obsolète et le maintenir vous-même.

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

strpos de bool, rly?

Il suffit de mettre ce code après vérification dans is_bool et is_float

Le code ne fait pas partie de ce package, mais de l'ancien PhpExcel

Dans le fichier PHPExcel "DefaultValueBinder.php", remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Cela corrigera l'erreur «Essayer d'accéder au décalage du tableau sur la valeur de type int». Mais vous devrez également effectuer une recherche et un remplacement pour les accolades dans tout le code PHPExcel pour résoudre l'erreur «La syntaxe d'accès au tableau et au décalage de chaîne avec accolades est obsolète» qui affecte également les mises à niveau de PHP vers la version 7.4. Je les ai simplement remplacés par "[" et "]" partout et tout fonctionne à nouveau correctement.

Merci mec. J'ai adoré. Thankx @burello <3

La meilleure chose à faire est de mettre à jour le PHPOffice/PhpSpreadsheet au-dessus de 1.10 dans votre projet - car alors cette erreur sera corrigée sans avoir à modifier manuellement la base de code du package. Donc pour moi

composer require phpoffice/phpspreadsheet "^1.10"

résolu le problème.

j'ai cette e'rror aussi

déjà désemparé

Dans le fichier PHPExcel "DefaultValueBinder.php", remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Cela corrigera l'erreur «Essayer d'accéder au décalage du tableau sur la valeur de type int». Mais vous devrez également effectuer une recherche et un remplacement pour les accolades dans tout le code PHPExcel pour résoudre l'erreur «La syntaxe d'accès au tableau et au décalage de chaîne avec accolades est obsolète» qui affecte également les mises à niveau de PHP vers la version 7.4. Je les ai simplement remplacés par "[" et "]" partout et tout fonctionne à nouveau correctement.

Merci de travailler pour moi !! orderimportexport.ocmod opencart 3x

Dans le fichier PHPExcel "DefaultValueBinder.php", remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Cela corrigera l'erreur «Essayer d'accéder au décalage du tableau sur la valeur de type int». Mais vous devrez également effectuer une recherche et un remplacement pour les accolades dans tout le code PHPExcel pour résoudre l'erreur «La syntaxe d'accès au tableau et au décalage de chaîne avec accolades est obsolète» qui affecte également les mises à niveau de PHP vers la version 7.4. Je les ai simplement remplacés par "[" et "]" partout et tout fonctionne à nouveau correctement.

Incroyable, tu m'as sauvé mon frère, merci beaucoup

remplacez cette ligne 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
avec ce qui suit:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {

travaille pour moi ...

image

Veuillez signaler les erreurs dans PhpSpreadsheet à PhpSpreadsheet.

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

Questions connexes

lucatamtam picture lucatamtam  ·  3Commentaires

bahmanyaghoobi picture bahmanyaghoobi  ·  3Commentaires

vandolphreyes picture vandolphreyes  ·  3Commentaires

rossjcooper picture rossjcooper  ·  3Commentaires

alejandri picture alejandri  ·  3Commentaires