Laravel-excel: [バグ]他のシートを参照して数式を評価するときにエラーが発生する

作成日 2019年08月23日  ·  10コメント  ·  ソース: Maatwebsite/Laravel-Excel

必ずお読みください:テンプレートへの入力が必要です! 十分な情報が含まれていない問題は取り上げられない可能性があります。 課題テンプレートを使用して記入されていない課題はクローズされます。 Laravel-Excelの貢献ガイドライン(https://laravel-excel.maatwebsite.nl/docs/3.1/getting-started/contributing)と行動規範(https://github.com/Maatwebsite/Laravel-Excel/)を読んだことがありますかblob / 3.1 / CODE_OF_CONDUCT.md)? 問題を提出することにより、すべての人に敬意を持って接することを含め、それを遵守することが期待されます。 問題の前に[BUG]を付けてください。

前提条件

次の操作を行った場合は、角かっこで囲んでXを入力します。
  • [x] Laravel Excelのバージョンがまだサポートされているかどうかを確認しました: https
  • []コードの外部で動作を再現できるため、問題はLaravelExcelに限定されます。
  • [x]問題がまだ提出されていないことを確認しました。
  • [x]この問題を修正するPRが提出されていないかどうかを確認しました。
  • [x]課題テンプレート全体に記入

バージョン

バージョン番号を証明するときは、できるだけ正確かつ完全にしてください
  • PHPバージョン:7.1.28
  • Laravelバージョン:5.6.39
  • パッケージバージョン:3.1.15

説明

スプレッドシートをインポートして特性WithCalculatedFormulasを含めると、数式=metadata!B10セル(つまり、別のワークシートを参照する)が評価されると、次のエラーが発生します。

nullでメンバー関数has()を呼び出す

完全なスタックトレースは以下のとおりです。

私の知る限り、セルが評価される前に他のシートが切断されているため、数式を評価できません。 Sheet->disconnect()内のコードをコメントアウトすることでこの疑いを確認しましたが、その後は機能しました。

問題は、インポーターが特性WithMultipleSheets別のシートから実行され、2番目のシートに移動すると、パフォーマンス上の理由で最初のシートが切断されることだと思います。

再現する手順

添付されているのは問題のあるシートで、セルtracks!G2は最初のシートを参照する数式が含まれています。

bundle-metadata-reference.xlsx

予想される行動:

シートがインポートされることを期待しています。

実際の動作:

エラーが発生します。

追加情報

スタックトレース:

#0 \/var\/www\/vendor\/phpoffice\/phpspreadsheet\/src\/PhpSpreadsheet\/Calculation\/Calculation.php(3870): PhpOffice\\PhpSpreadsheet\\Worksheet\\Worksheet->cellExists('B10')
#1 \/var\/www\/vendor\/phpoffice\/phpspreadsheet\/src\/PhpSpreadsheet\/Calculation\/Calculation.php(2944): PhpOffice\\PhpSpreadsheet\\Calculation\\Calculation->processTokenStack(Array, 'G2', Object(PhpOffice\\PhpSpreadsheet\\Cell\\Cell))
#2 \/var\/www\/vendor\/phpoffice\/phpspreadsheet\/src\/PhpSpreadsheet\/Calculation\/Calculation.php(2734): PhpOffice\\PhpSpreadsheet\\Calculation\\Calculation->_calculateFormulaValue('metadata!B10', 'G2', Object(PhpOffice\\PhpSpreadsheet\\Cell\\Cell))
#3 \/var\/www\/vendor\/phpoffice\/phpspreadsheet\/src\/PhpSpreadsheet\/Cell\/Cell.php(262): PhpOffice\\PhpSpreadsheet\\Calculation\\Calculation->calculateCellValue(Object(PhpOffice\\PhpSpreadsheet\\Cell\\Cell), true)
#4 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Cell.php(61): PhpOffice\\PhpSpreadsheet\\Cell\\Cell->getCalculatedValue()
#5 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Row.php(65): Maatwebsite\\Excel\\Cell->getValue(NULL, true, false)
#6 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Sheet.php(283): Maatwebsite\\Excel\\Row->toArray(NULL, true, false)
#7 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Sheet.php(245): Maatwebsite\\Excel\\Sheet->toArray(Object(Wata\\Upload\\Imports\\AlbumTracksImport), 2, NULL, true)
#8 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Reader.php(111): Maatwebsite\\Excel\\Sheet->import(Object(Wata\\Upload\\Imports\\AlbumTracksImport), 2)
#9 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Concerns\/ManagesTransactions.php(29): Maatwebsite\\Excel\\Reader->Maatwebsite\\Excel\\{closure}(Object(Illuminate\\Database\\MySqlConnection))
#10 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Transactions\/DbTransactionHandler.php(30): Illuminate\\Database\\Connection->transaction(Object(Closure))
#11 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Reader.php(115): Maatwebsite\\Excel\\Transactions\\DbTransactionHandler->__invoke(Object(Closure))
#12 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Excel.php(146): Maatwebsite\\Excel\\Reader->read(Object(Wata\\Upload\\Imports\\AlbumBundleImport), '\/tmp\/reqfile_Jj...', 'Xlsx', NULL)
#13 \/var\/www\/vendor\/maatwebsite\/excel\/src\/Concerns\/Importable.php(37): Maatwebsite\\Excel\\Excel->import(Object(Wata\\Upload\\Imports\\AlbumBundleImport), '\/tmp\/reqfile_Jj...', NULL, 'Xlsx')
#14 \/var\/www\/app\/Wata\/Upload\/BundleService.php(60): Wata\\Upload\\Imports\\AlbumBundleImport->import('\/tmp\/reqfile_Jj...', NULL, 'Xlsx')
#15 \/var\/www\/app\/Http\/Controllers\/Upload\/BundleController.php(70): Wata\\Upload\\BundleService->buildBundleFromExcelFileRequest(Object(Wata\\Upload\\Requests\\ExcelFileRequest), 's3')
#16 [internal function]: App\\Http\\Controllers\\Upload\\BundleController->store(Object(Wata\\Upload\\Requests\\ExcelFileRequest))
#17 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Controller.php(54): call_user_func_array(Array, Array)
#18 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('store', Array)
#19 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Route.php(212): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Upload\\BundleController), 'store')
#20 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Route.php(169): Illuminate\\Routing\\Route->runController()
#21 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php(665): Illuminate\\Routing\\Route->run()
#22 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#23 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Middleware\/ThrottleRequests.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#24 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle(Object(Illuminate\\Http\\Request), Object(Closure), 1000, '1')
#25 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#26 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Middleware\/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#27 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#28 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#29 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Auth\/Middleware\/Authenticate.php(43): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#30 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure), 'api')
#31 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#32 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#33 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#34 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#35 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#36 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#37 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#38 \/var\/www\/app\/Http\/Middleware\/Localisation.php(38): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#39 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): App\\Http\\Middleware\\Localisation->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#40 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#41 \/var\/www\/app\/Http\/Middleware\/ConvertToApiResponse.php(20): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#42 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): App\\Http\\Middleware\\ConvertToApiResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#43 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#44 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#45 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php(667): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#46 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php(642): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#47 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php(608): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#48 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php(597): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#49 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#50 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#51 \/var\/www\/vendor\/fideloper\/proxy\/src\/TrustProxies.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#52 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#53 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#54 \/var\/www\/vendor\/barryvdh\/laravel-cors\/src\/HandleCors.php(36): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#55 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Barryvdh\\Cors\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#56 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#57 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/CheckForMaintenanceMode.php(62): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#58 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#59 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#60 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#61 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#62 \/var\/www\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#63 \/var\/www\/public\/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#64 {main}"]
bug

全てのコメント10件

@patrickbrouwersこの例外も発生します: Call to a member function has() on nullあるシートがセル数式の別のシートを参照している場合。

リリースではなく最新の3.1ブランチが必要でしたが、PRはこの特定の問題に違いはありません。

OPは正しいので、切断呼び出しを削除すると問題が解決します。

これは潜在的に懸念事項でしょうか? DoesNotDisconnect ...それらの線に沿って何か? 次に、その特定のシートを切断しないようにチェックを実行できます。 当然のことながら、これは大きなスプレッドシートのメモリの問題を引き起こす可能性があります。

これには、ReadChunkジョブも変更する必要があります。

@ plogic-aaron前述のように、修正はマージされており、次のリリースで提供される予定です。

@patrickbrouwersに感謝しますが、前述のように、修正を確認するために最新のコミットで3.1ブランチが必要でしたが、それでも同じ問題が発生したため、これは別のブランチにマージされましたか?

編集:シート2(シート1を参照)が最初に処理されるようにインポートの順序を変更すると、問題も解決されます。これは、最初の切断呼び出しの前に両方がまだロードされているためです。

その場合、おそらく別の問題が発生しています。 おそらくあなたの場合、参照値はファイルにキャッシュされていません。 切断するかどうかを決定する設定があれば大丈夫です。 お気軽にPRしてください

こんにちは@patrickbrouwers 、ここでは@ eprop-aaronと@ archy-boldの同じ問題は、#2392とは関係ありません。私は3.1.18リリースを使用しています。 これを修正しましたか?

まだ誰もPRしていません

申し訳ありませんが、私はこれらすべてに不慣れですが、これを修正するためのコミットメントがなかったようです。 だから作ってみました、こちらです。

https://github.com/jpagarcia/Laravel-Excel

@jpagarciaそのコミットからPRを開くことができます。そこでレビューします。

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