Laravel-excel: [BUG] Import EXCEL acontece exceção no PHP7.4, resposta: Tentando acessar o deslocamento do array no valor do tipo int

Criado em 5 dez. 2019  ·  24Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Versões

  • Versão do PHP: PHP7.4 (Centos7 yum instalado php74 da versão estável remisrepo)
  • Versão do Laravel: Laravel Framework 5.8.35
  • Versão do pacote: maatwebsite / excel 3.1.17

Descrição

Import EXCEL acontece exceção no PHP7.4,
Exceção-> mensagem () é:
Tentando acessar o deslocamento da matriz no valor do tipo int.

Passos para reproduzir

Comportamento esperado:

importar um arquivo xlsx enquanto executo o código no php72w

Comportamento real:
aconteceu depois de fazer o upload do meu servidor circunstância de php7.2 para php7.4 quando eu importo um Excel seria uma falha como acima.

seria normal novamente se eu fizesse o downgrade de php7.4 para php7.2.

informação adicional

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

E o que está na classe de importação:

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

Comentários muito úteis

No arquivo PHPExcel "DefaultValueBinder.php", substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Isso corrigirá o erro "Tentando acessar o deslocamento da matriz no valor do tipo int". Mas você também precisará realizar uma localização e substituição de chaves em todo o código PHPExcel para resolver o erro "A sintaxe de acesso de deslocamento de array e string com chaves está obsoleta", que também afeta as atualizações do PHP para 7.4. Eu simplesmente os substituí por "[" e "]" em todos os lugares e tudo está funcionando bem novamente.

Todos 24 comentários

Obrigado por enviar o tíquete. Infelizmente, as informações fornecidas estão incompletas. Precisamos saber qual versão você usa e como reproduzi-la. Inclua exemplos de código. Antes de retirá-lo, verifique (https://github.com/Maatwebsite/Laravel-Excel/blob/3.1/.github/ISSUE_TEMPLATE.md) e adicione as informações que faltam. Para tornar o processamento deste tíquete muito mais fácil, certifique-se de verificar (https://laravel-excel.maatwebsite.nl/3.1/getting-started/contributing.html) e verifique novamente se você preencheu o modelo de problema corretamente. Isso nos permitirá retirar sua passagem de forma mais eficiente. Os problemas que seguem as diretrizes corretamente terão prioridade sobre os outros problemas.

Você pode mostrar um pouco mais de rastreamento de pilha, não posso confirmar o bug ao usar o pacote no PHP7.4. Talvez seja algo em seu próprio código?

Olá @patrickbrouwers, obrigado pelo pacote, sou um grande fã dele!

Estou recebendo um erro semelhante após a atualização, embora seja durante uma exportação, e o stacktrace indica que o problema é com phpsreadsheet, não com Laravel-Excel, mas o Google me trouxe aqui.

Aqui está o rastreamento de pilha:

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

Corrigido em PhpSpreadsheet, consulte https://github.com/PHPOffice/PhpSpreadsheet/issues/1300

No arquivo PHPExcel "DefaultValueBinder.php", substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Isso corrigirá o erro "Tentando acessar o deslocamento da matriz no valor do tipo int". Mas você também precisará realizar uma localização e substituição de chaves em todo o código PHPExcel para resolver o erro "A sintaxe de acesso de deslocamento de array e string com chaves está obsoleta", que também afeta as atualizações do PHP para 7.4. Eu simplesmente os substituí por "[" e "]" em todos os lugares e tudo está funcionando bem novamente.

DefaultValueBinder.php dentro da pasta do vendedor? ou onde fica? mesmo problema aqui.

DefaultValueBinder.php dentro da pasta do vendedor? ou onde fica? mesmo problema aqui.

Me desculpe. Eu deveria ter sido mais específico. Na minha instalação, ele está localizado na pasta PHPExcel neste local: PHPExcel \ Cell \ DefaultValueBinder.php
Pode ser diferente da sua instalação. Mas você deve conseguir fazer uma busca por ele em seu sistema.

a linha eu acho que é 62, não 82 meu amigo! e eu espero que funcione porque estou estressado. Não consigo encontrar a solução para o erro em meu projeto: Erro ERROR: tentando acessar o deslocamento da matriz no valor do tipo int '/ Cell / DefaultValueBinder. php: 56 '. Tenho grandes esperanças!

Este é o caminho: third_party / PHPExcel / Classes / PHPExcel / Cell / DefaultValueBinder.php
Aqui, third_party significa onde você manteve sua pasta PHPExcel

Agora pesquise === '=' e verifique se há uma linha correspondente, em seguida, substitua por aquela específica para
0 === strpos ($ pValue, '=')
O resto seria o mesmo. No meu caso foi
$ pValue [0] === '='

No arquivo PHPExcel "DefaultValueBinder.php", substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Isso corrigirá o erro "Tentando acessar o deslocamento da matriz no valor do tipo int". Mas você também precisará realizar uma localização e substituição de chaves em todo o código PHPExcel para resolver o erro "A sintaxe de acesso de deslocamento de array e string com chaves está obsoleta", que também afeta as atualizações do PHP para 7.4. Eu simplesmente os substituí por "[" e "]" em todos os lugares e tudo está funcionando bem novamente.

funciona! amo você!

No arquivo PHPExcel "DefaultValueBinder.php", substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Isso corrigirá o erro "Tentando acessar o deslocamento da matriz no valor do tipo int". Mas você também precisará realizar uma localização e substituição de chaves em todo o código PHPExcel para resolver o erro "A sintaxe de acesso de deslocamento de array e string com chaves está obsoleta", que também afeta as atualizações do PHP para 7.4. Eu simplesmente os substituí por "[" e "]" em todos os lugares e tudo está funcionando bem novamente.

Quando eu estava quase fazendo downgrade para o PHP 7.3, obrigado cara, isso me ajudou

Alguma idéia de resolver este problema com PHP 7.4.3 & maatwebsite / excel versão 2.1?

Você teria que fazer um fork do pacote phpexcel obsoleto e manter o fork sozinho.

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

strpos de bool, rly?

Basta colocar este código após a verificação em is_bool e is_float

O código não faz parte deste pacote, mas sim do legado PhpExcel

No arquivo PHPExcel "DefaultValueBinder.php", substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Isso corrigirá o erro "Tentando acessar o deslocamento da matriz no valor do tipo int". Mas você também precisará realizar uma localização e substituição de chaves em todo o código PHPExcel para resolver o erro "A sintaxe de acesso de deslocamento de array e string com chaves está obsoleta", que também afeta as atualizações do PHP para 7.4. Eu simplesmente os substituí por "[" e "]" em todos os lugares e tudo está funcionando bem novamente.

Obrigado cara. Amei. Obrigado, @burello <3

A melhor coisa a fazer é atualizar o PHPOffice/PhpSpreadsheet acima de 1.10 em seu projeto - porque então esse erro será corrigido sem a necessidade de editar manualmente a base de código do pacote. Então para mim

composer require phpoffice/phpspreadsheet "^1.10"

corrigiu o problema.

eu tenho esse erro também

já sem noção

No arquivo PHPExcel "DefaultValueBinder.php", substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Isso corrigirá o erro "Tentando acessar o deslocamento da matriz no valor do tipo int". Mas você também precisará realizar uma localização e substituição de chaves em todo o código PHPExcel para resolver o erro "A sintaxe de acesso de deslocamento de array e string com chaves está obsoleta", que também afeta as atualizações do PHP para 7.4. Eu simplesmente os substituí por "[" e "]" em todos os lugares e tudo está funcionando bem novamente.

Obrigado por trabalhar para mim !! orderimportexport.ocmod opencart 3x

No arquivo PHPExcel "DefaultValueBinder.php", substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {
Isso corrigirá o erro "Tentando acessar o deslocamento da matriz no valor do tipo int". Mas você também precisará realizar uma localização e substituição de chaves em todo o código PHPExcel para resolver o erro "A sintaxe de acesso de deslocamento de array e string com chaves está obsoleta", que também afeta as atualizações do PHP para 7.4. Eu simplesmente os substituí por "[" e "]" em todos os lugares e tudo está funcionando bem novamente.

Incrível, você me salvou mano, muito obrigado

substitua esta linha 82:
} elseif ($ pValue [0] === '=' && strlen ($ pValue)> 1) {
com o seguinte:
} elseif (0 === strpos ($ pValue, '=') && strlen ($ pValue)> 1) {

trabalhando para mim ...

image

Por favor, reporte os erros dentro do PhpSpreadsheet para o PhpSpreadsheet.

Esta página foi útil?
0 / 5 - 0 avaliações