バージョン
PHPバージョン:7.2
Laravelバージョン:5.7
パッケージバージョン:3.1
次のエラーが発生します: '開始行(2)が最上位行(1)を超えています' /Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php
スプレッドシートの最初の行にはヘッダーがあり、1枚のシートです。 2行目は空白ですが、これで問題ありませんか? このシナリオをどのように説明するかわかりません。 どんな助けでも大歓迎です。 ありがとう。
App \ Imports \ PoliciesImport.php
<?php
namespace App\Imports;
use App\Policy;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Auth;
class PoliciesImport implements ToModel, WithValidation, WithHeadingRow, WithMultipleSheets
{
use Importable;
/**
* <strong i="14">@param</strong> array $row
*
* <strong i="15">@return</strong> \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Policy([
'user_id' => Auth::user()->id,
'policy_name' => $row['name'],
'phone' => $row['phone'],
'street' => $row['address'],
'city' => $row['city'],
'state' => $row['state'],
'postal_code' => $row['postal_code'],
]);
}
public function sheets(): array
{
return [
// Select by sheet index
0 => new PoliciesImport(),
];
}
public function rules(): array
{
return [
'policy_name' => 'required|string',
'*.policy_name' => 'required|string',
];
}
}
PolicyController.php
public function import(Request $request)
{
if ($request->hasFile('file')) {
// validate incoming request
$this->validate($request, [
'file' => 'required|file|mimes:xls,xlsx,csv|max:10240', //max 10Mb
]);
if ($request->file('file')->isValid()) {
$file = $request->file('file');
$path = $file->store('uploads/policy');
$fileHeaders = current((new HeadingRowImport)->toArray($path)[0]);
$validHeaders = [
'name','phone','address','state','city','postal_code'
];
sort($fileHeaders);
sort($validHeaders);
// Check the File Headers
if ($fileHeaders == $validHeaders) {
// Import the saved excel file
(new PoliciesImport)->import($path);
}
Storage::delete($path);
}
}
return back();
}
完全なスタックトレースを投稿できますか? 現在、どのインポートが原因であるかを確認するのは困難です。
/Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php
*
* <strong i="8">@param</strong> int $startRow The row number at which to start iterating
*
* <strong i="9">@throws</strong> PhpSpreadsheetException
*
* <strong i="10">@return</strong> RowIterator
*/
public function resetStart($startRow = 1)
{
if ($startRow > $this->subject->getHighestRow()) {
throw new PhpSpreadsheetException("Start row ({$startRow}) is beyond highest row ({$this->subject->getHighestRow()})");
}
$this->startRow = $startRow;
if ($this->endRow < $this->startRow) {
$this->endRow = $this->startRow;
}
$this->seek($startRow);
return $this;
}
/**
* (Re)Set the end row.
*
申し訳ありません。 これは役に立ちますか?
ありがとう!
ここでも同じ問題があります!
スタックトレースによると、ファイルには1行(見出し行)しかありません。各行をインポートしようとすると、PhpSpreadsheetは2行目がない(2行目より先の行がない)と文句を言います。
@patrickbrouwers私の場合、行1を超える行と値が確実にあります。問題を解決するには、懸念事項WithChunkReading
とWithCustomChunkSize
の両方を実装したことを確認する必要があるようです。 そうは言っても、新しいExcelファイルを作成し、古いファイルの値をコピーしました。
値を新しいファイルにコピーした後に機能する場合は、ファイルに問題がある可能性があります。
CSVの場合、おそらく正しい区切り文字を使用していませんか?
うん。 かなり可能。 すぐにいくつかの異なるファイルを処理するので、再びポップアップした場合はここに戻ります。 それらはすべてXLSXファイルです。
確かに、私に知らせてください!
@patrickbrouwersはい、これは本当です。 この場合、サーバーエラーを防止しようとしていますが、サーバーエラーをキャッチして、モデルのインポートメソッドの実行を停止する方法に苦労しています。
App \ Imports \ PoliciesImport.phpでRegistersEventListenersを使用することで、私は正しい方向に進んでいますか? 一番上の行を取得する方法はわかりましたが、この値を渡す方法や、ここからどこに進むかがわかりません。
public static function beforeImport(BeforeImport $event)
{
$worksheet = $event->reader->getActiveSheet();
$highestRow = $worksheet->getHighestRow(); // e.g. 10
dd($highestRow);
}
@abbylovesdonは、beforeImportで例外をスローし、コントローラーでキャッチしてみることをお勧めします。 最上位の行を例外に渡すことができます。
@patrickbrouwersご協力ありがとうございます! 私はPHP / Laravel / This Packageを初めて使用するので、他の誰かが私の立場にある場合は、次のようにします。
私のインポートクラス:App \ Imports \ PoliciesImport.php
<?php
namespace App\Imports;
use App\Policy;
use Auth;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Validators\Failure;
use Maatwebsite\Excel\Validators\ValidationException;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Events\BeforeImport;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
class PoliciesImport implements ToModel, WithValidation, WithHeadingRow, WithMultipleSheets, WithEvents
{
use Importable, RegistersEventListeners;
public static function beforeImport(BeforeImport $event)
{
$worksheet = $event->reader->getActiveSheet();
$highestRow = $worksheet->getHighestRow(); // e.g. 10
if ($highestRow < 2) {
$error = \Illuminate\Validation\ValidationException::withMessages([]);
$failure = new Failure(1, 'rows', [0 => 'Now enough rows!']);
$failures = [0 => $failure];
throw new ValidationException($error, $failures);
}
}
/**
* <strong i="8">@param</strong> array $row
*
* <strong i="9">@return</strong> \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Policy([
'user_id' => Auth::user()->id,
'policy_name' => $row['name'],
'phone' => $row['phone'],
'street' => $row['address'],
'city' => $row['city'],
'state' => $row['state'],
'postal_code' => $row['postal_code'],
]);
}
public function sheets(): array
{
return [
// Select by sheet index
0 => new PoliciesImport(),
];
}
public function rules(): array
{
return [
'name' => 'required|string',
'*.name' => 'required|string',
];
}
}
これで、コントローラーで次を使用できます。
try {
(new PoliciesImport)->import($path);
} catch (\Exception $e) {
$failures = $e->failures();
dd($failures[0]);
}
ここでも同じ問題があります! :((
ここでも同じ問題があります! :((
上記の提案と例を使用して問題を修正できない場合は、問題テンプレートを使用して、新しい問題を開くようにお願いします。 ありがとう!
同じエラーがあります!
しかし、シート2を削除した後、3は解決しました!!
この状況では、シートインデックスを次のように定義する必要があります。
public function sheets(): array
{
return [
// Select by sheet index
0 => new pricelist_items(),
];
}
同じことが起こりましたが、Excelファイルに複数のシートが存在することが原因であることに気づきました
私はちょうど同じ問題を抱えていました。 いくつかの欲求不満の後、私の根底にある疑惑は真実であることが証明されました。 スプレッドシートの分割が原因でした。 最初の行を「解凍」した後、それは機能しました。
スタックトレースによると、ファイルには1行(見出し行)しかありません。各行をインポートしようとすると、PhpSpreadsheetは2行目がない(2行目より先の行がない)と文句を言います。
Excelにヘッダー行しかない場合の処理方法。 クライアントに適切なエラーメッセージを表示したい
こんにちは私はこのスレッドが閉じられていることを知っていますが、私はここで同じ問題を抱えており、このスレッドの何も私の問題を助けません。
同時に10k行をアップロードしていますが、このエラーStart row (2) is beyond highest row (1)
が発生しました。 しかし、それを5kに分割すると、魔法のように機能します。
ここで何が問題になっているようですか?
前もって感謝します!
こんにちは私はこのスレッドが閉じられていることを知っていますが、私はここで同じ問題を抱えており、このスレッドの何も私の問題を助けません。
同時に10k行をアップロードしていますが、このエラー
Start row (2) is beyond highest row (1)
が発生しました。 しかし、それを5kに分割すると、魔法のように機能します。ここで何が問題になっているようですか?
前もって感謝します!
おそらく、元のファイルを分割して解決したエラーです。 これもパフォーマンスの問題である可能性がありますが、コードとサーバーの仕様を見ずに判断するのは困難です。 ファイルエラーだと思います。
ちょうどこれが私に起こったのです。 ファイルがPHPの「upload_max_filesize」ディレクティブよりも大きい場合に発生します。 AWSAMIでの最大 'upload_max_filesize'は2MBでしたが、ファイルサイズが5MBで40k行の場合は500のチャンクを使用しました。 Start row (2) is beyond highest row (1)
を混乱させるのではなく、最大アップロードサイズのチェックを実装し、このエラーを出力することを作成者に提案できますか。 'upload_max_filesize'制限を増やすと、エラーはなくなり、ファイルのアップロードは成功しました。
phpspreadsheetがそのエラーをスローする理由はおそらくもっとあります。 あなたはいつでもあそこでPRを試みることができます。
@GlennM返信ありがとうございます!
私はそれを回避しましたが、今のところ私のプロジェクトのニーズにぴったりです。 私が将来この問題を抱えている場合は、あなたの提案を検討します。
@patrickbrouwers私の場合、行1を超える行と値が確実にあります。問題を解決するには、懸念事項
WithChunkReading
とWithCustomChunkSize
の両方を実装したことを確認する必要があるようです。 そうは言っても、新しいExcelファイルを作成し、古いファイルの値をコピーしました。
それは私に役立ちます。 まだ同じ問題があります
ワークシートの削除は空です
ワークシートの削除は空です
これは私の場合でした。ファイルに空のワークシートがあり、「WithHeadingRow」を使用すると、この問題が発生します。
最も参考になるコメント
同じエラーがあります!
しかし、シート2を削除した後、3は解決しました!!
この状況では、シートインデックスを次のように定義する必要があります。