Laravel-excel: [バグ] PHP7.4でEXCELのインポート例外が発生し、応答:int型の値で配列オフセットにアクセスしようとしています

作成日 2019年12月05日  ·  24コメント  ·  ソース: Maatwebsite/Laravel-Excel

バージョン

  • PHPバージョン:PHP7.4(Centos7 yumがインストールされたphp74フォームremisrepo安定バージョン)
  • Laravelバージョン:Laravel Framework 5.8.35
  • パッケージバージョン:maatwebsite / excel 3.1.17

説明

インポートEXCELはPHP7.4で例外が発生します。
例外-> message()は次のとおりです。
int型の値で配列オフセットにアクセスしようとしています。

再現する手順

予想される行動:

php72wでコードを実行しながらxlsxファイルをインポートします

実際の動作:
サーバーの状況をphp7.2からphp7.4にアップロードした後、Excelをインポートすると、上記のように失敗します。

php7.4からphp7.2にダウングレードすると、再び正常になります。

追加情報

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

そして、インポートクラスには何がありますか:

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

最も参考になるコメント

PHPExcelファイル「DefaultValueBinder.php」で、次の行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){
これにより、「int型の値で配列オフセットにアクセスしようとしています」エラーが修正されます。 ただし、PHPExcelコード全体で中括弧の検索と置換を実行して「中括弧を使用した配列と文字列のオフセットアクセス構文は非推奨です」というエラーに対処する必要があります。これは、PHPの7.4へのアップグレードにも影響します。 どこでも「[」と「]」に置き換えるだけで、すべてが正常に機能しています。

全てのコメント24件

チケットを提出していただきありがとうございます。 残念ながら、あなたが提供した情報は不完全です。 使用しているバージョンとその再現方法を知る必要があります。 コード例を含めてください。 取得する前に、(https://github.com/Maatwebsite/Laravel-Excel/blob/3.1/.github/ISSUE_TEMPLATE.md)を確認し、不足している情報を追加してください。 このチケットの処理をはるかに簡単にするために、必ず(https://laravel-excel.maatwebsite.nl/3.1/getting-started/contributing.html)を確認し、問題テンプレートに入力したかどうかを再確認してください。正しく。 これにより、チケットをより効率的に受け取ることができます。 ガイドラインに正しく従う問題は、他の問題よりも優先されます。

もう少しスタックトレースを表示できますか。PHP7.4でパッケージを使用するとバグを確認できません。 多分それはあなた自身のコードの何かですか?

こんにちは@patrickbrouwersパッケージをありがとう、私はそれの大ファンです!

アップグレード中ですが、アップグレード後に同様のエラーが発生します。スタックトレースは、問題がLaravel-Excelではなくphpsreadsheetにあることを示していますが、googleが私をここに連れてきました。

スタックトレースは次のとおりです。

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

PhpSpreadsheetで修正されました。https: //github.com/PHPOffice/PhpSpreadsheet/issues/1300を参照して

PHPExcelファイル「DefaultValueBinder.php」で、次の行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){
これにより、「int型の値で配列オフセットにアクセスしようとしています」エラーが修正されます。 ただし、PHPExcelコード全体で中括弧の検索と置換を実行して「中括弧を使用した配列と文字列のオフセットアクセス構文は非推奨です」というエラーに対処する必要があります。これは、PHPの7.4へのアップグレードにも影響します。 どこでも「[」と「]」に置き換えるだけで、すべてが正常に機能しています。

ベンダーフォルダ内のDefaultValueBinder.php? またはそれはどこにありますか? ここで同じ問題。

ベンダーフォルダ内のDefaultValueBinder.php? またはそれはどこにありますか? ここで同じ問題。

謝罪いたします。 もっと具体的にすべきだった。 私のインストールでは、次の場所のPHPExcelフォルダーにあります:PHPExcel \ Cell \ DefaultValueBinder.php
インストールによって異なる場合があります。 ただし、システム上で検索を実行できるはずです。

私が思うラインは62であり、私の友人の82ではありません! そして私はそれがうまくいくことを願っています。 プロジェクトでエラーの解決策が見つかりません:エラーエラー:タイプint '/ Cell / DefaultValueBinderの値の配列オフセットにアクセスしようとしています。 php:56 '。 期待しています!

これはパスです:third_party / PHPExcel / Classes / PHPExcel / Cell / DefaultValueBinder.php
ここで、third_partyは、PHPExcelフォルダーを保存した場所を意味します

次に、=== '='を検索し、一致する行があるかどうかを確認してから、特定の行に置き換えます。
0 === strpos($ pValue、 '=')
残りは同じでしょう。 私の場合は
$ pValue [0] === '='

PHPExcelファイル「DefaultValueBinder.php」で、次の行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){
これにより、「int型の値で配列オフセットにアクセスしようとしています」エラーが修正されます。 ただし、PHPExcelコード全体で中括弧の検索と置換を実行して「中括弧を使用した配列と文字列のオフセットアクセス構文は非推奨です」というエラーに対処する必要があります。これは、PHPの7.4へのアップグレードにも影響します。 どこでも「[」と「]」に置き換えるだけで、すべてが正常に機能しています。

できます! あなたを愛してます!

PHPExcelファイル「DefaultValueBinder.php」で、次の行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){
これにより、「int型の値で配列オフセットにアクセスしようとしています」エラーが修正されます。 ただし、PHPExcelコード全体で中括弧の検索と置換を実行して「中括弧を使用した配列と文字列のオフセットアクセス構文は非推奨です」というエラーに対処する必要があります。これは、PHPの7.4へのアップグレードにも影響します。 どこでも「[」と「]」に置き換えるだけで、すべてが正常に機能しています。

PHP 7.3にダウングレードするところだったとき、ありがとうございました。

PHP7.4.3とmaatwebsite / excelバージョン2.1でこの問題を解決するためのアイデアはありますか?

非推奨のphpexcelパッケージをフォークし、フォークを自分で保守する必要があります。

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

ブールのstrpos、rly?

チェック後にこのコードをis_boolとis_floatに配置するだけです

コードはこのパッケージの一部ではありませんが、レガシーPhpExcelの一部です

PHPExcelファイル「DefaultValueBinder.php」で、次の行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){
これにより、「int型の値で配列オフセットにアクセスしようとしています」エラーが修正されます。 ただし、PHPExcelコード全体で中括弧の検索と置換を実行して「中括弧を使用した配列と文字列のオフセットアクセス構文は非推奨です」というエラーに対処する必要があります。これは、PHPの7.4へのアップグレードにも影響します。 どこでも「[」と「]」に置き換えるだけで、すべてが正常に機能しています。

ありがとうございます。 楽しかった。 ありがとう@burello <3

プロジェクトで1.10を超えるPHPOffice/PhpSpreadsheetを更新するのが最善の方法です。そうすると、パッケージコードベースを手動で編集しなくても、このエラーが修正されるためです。 だから私にとって

composer require phpoffice/phpspreadsheet "^1.10"

問題を修正しました。

私もこのエラーがあります

すでに無知

PHPExcelファイル「DefaultValueBinder.php」で、次の行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){
これにより、「int型の値で配列オフセットにアクセスしようとしています」エラーが修正されます。 ただし、PHPExcelコード全体で中括弧の検索と置換を実行して「中括弧を使用した配列と文字列のオフセットアクセス構文は非推奨です」というエラーに対処する必要があります。これは、PHPの7.4へのアップグレードにも影響します。 どこでも「[」と「]」に置き換えるだけで、すべてが正常に機能しています。

私のために働いてくれてありがとう! orderimportexport.ocmod opencart 3x

PHPExcelファイル「DefaultValueBinder.php」で、次の行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){
これにより、「int型の値で配列オフセットにアクセスしようとしています」エラーが修正されます。 ただし、PHPExcelコード全体で中括弧の検索と置換を実行して「中括弧を使用した配列と文字列のオフセットアクセス構文は非推奨です」というエラーに対処する必要があります。これは、PHPの7.4へのアップグレードにも影響します。 どこでも「[」と「]」に置き換えるだけで、すべてが正常に機能しています。

すごい、あなたは私を救ってくれました、どうもありがとう

この行82を置き換えます。
} elseif($ pValue [0] === '=' && strlen($ pValue)> 1){
次のように:
} elseif(0 === strpos($ pValue、 '=')&& strlen($ pValue)> 1){

私のために働いています...

image

PhpSpreadsheet内のエラーをPhpSpreadsheetに報告してください。

このページは役に立ちましたか?
0 / 5 - 0 評価