Skip to content

Commit 1c3930d

Browse files
committed
Allow to stop chunk import early
1 parent d090d69 commit 1c3930d

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

docs/import/chunk.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,6 @@ Injected ExcelFile example:
3838
$import->chunk(250, function($results)
3939
{
4040
// do stuff
41-
})
41+
// or return true if you want to stop importing.
42+
});
4243
}

src/Maatwebsite/Excel/Readers/LaravelExcelReader.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,8 @@ public function chunk($size = 10, $callback = null)
495495
// Only read
496496
$this->reader->setReadDataOnly(true);
497497

498+
$break = false;
499+
498500
// Start the chunking
499501
for ($startRow = 0; $startRow < $totalRows; $startRow += $chunkSize)
500502
{
@@ -512,11 +514,16 @@ public function chunk($size = 10, $callback = null)
512514
$results = $this->get()->slice($startIndex, $chunkSize);
513515

514516
// Do a callback
515-
if(is_callable($callback))
516-
call_user_func($callback, $results);
517+
if(is_callable($callback)) {
518+
$break = call_user_func($callback, $results);
519+
}
517520

518521
$this->_reset();
519522
unset($this->excel, $results);
523+
524+
if ($break === true) {
525+
break;
526+
}
520527
}
521528
}
522529

tests/Filters/ChunkReadFilterTest.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ public function testCanChunkCsv()
4141
}
4242

4343

44+
public function testCanStopChunkEarly()
45+
{
46+
$this->assertCanStopChunkEarly(1,"sample.xls", 5);
47+
$this->assertCanStopChunkEarly(1,"sample.xlsx", 2);
48+
$this->assertCanStopChunkEarly(2,"sample.csv", 1);
49+
}
50+
51+
4452
public function testCanChunkMultipleSheets()
4553
{
4654
$output = [];
@@ -85,4 +93,19 @@ private function assertCanChunkIntoGroups($expected_chunks, $file, $chunk_size)
8593
$this->assertEquals($expected_chunks, $rounds, "Expecting total chunks is $expected_chunks when chunk with size $chunk_size");
8694

8795
}
88-
}
96+
97+
private function assertCanStopChunkEarly($expected_chunks, $file, $chunk_size)
98+
{
99+
$rounds = 0;
100+
101+
$this->excel->filter('chunk')->load(__DIR__ . "/files/{$file}")->chunk($chunk_size,function($results) use (&$rounds, $expected_chunks){
102+
$rounds++;
103+
104+
if ($rounds === $expected_chunks) {
105+
return true;
106+
}
107+
});
108+
109+
$this->assertEquals($expected_chunks, $rounds, "Expecting total chunks is $expected_chunks when chunk with size $chunk_size");
110+
}
111+
}

0 commit comments

Comments
 (0)