diff --git a/src/Data/Import/Sheet.php b/src/Data/Import/Sheet.php index 2b46611..f7a8c5e 100644 --- a/src/Data/Import/Sheet.php +++ b/src/Data/Import/Sheet.php @@ -5,6 +5,7 @@ namespace Vartruexuan\HyperfExcel\Data\Import; use Vartruexuan\HyperfExcel\Data\BaseObject; +use Vartruexuan\HyperfExcel\Exception\ExcelException; class Sheet extends BaseObject { @@ -159,8 +160,27 @@ public function formatRowByHeader($row, $header) * @var Column $column */ foreach ($this->columns as $column) { - $data[$column->field ?: $column->title] = $row[$header[$column->title]]; + $headerIndex = $header[$column->title] ?? ''; + $data[$column->field ?: $column->title] = $row[$headerIndex] ?? ''; } return $data; } + + + /** + * 校验header头正确性 + * + * @param array $header + * @return void + * @throws ExcelException + */ + public function validateHeader(array $header = []) + { + foreach ($this->columns as $column) { + if (!in_array($column->title, $header)) { + throw new ExcelException("The column header does not exist in [{$column->title}]"); + } + } + } + } \ No newline at end of file diff --git a/src/Driver/XlsWriterDriver.php b/src/Driver/XlsWriterDriver.php index ca40887..f26a7cc 100644 --- a/src/Driver/XlsWriterDriver.php +++ b/src/Driver/XlsWriterDriver.php @@ -20,6 +20,7 @@ use Vartruexuan\HyperfExcel\Event\BeforeExportSheet; use Vartruexuan\HyperfExcel\Event\BeforeImportExcel; use Vartruexuan\HyperfExcel\Event\BeforeImportSheet; +use Vartruexuan\HyperfExcel\Exception\EmptyDataException; use Vartruexuan\HyperfExcel\Exception\ExcelException; use Vartruexuan\HyperfExcel\Helper\Helper; use Vtiful\Kernel\Excel; @@ -245,7 +246,7 @@ protected function importSheet(Excel $excel, ImportSheet $sheet, ImportConfig $c $sheetName = $sheet->name; $this->event->dispatch(new BeforeImportSheet($config, $this, $sheet)); - + $excel->openSheet($sheetName); $header = []; @@ -256,7 +257,10 @@ protected function importSheet(Excel $excel, ImportSheet $sheet, ImportConfig $c // 跳过指定行 $excel->setSkipRows($sheet->headerIndex - 1); } - $header = $excel->nextRow(); + if (null === $header = $excel->nextRow()) { + throw new EmptyDataException('The imported data is empty.'); + } + $sheet->validateHeader($header); } $columnTypes = $sheet->getColumnTypes($header ?? []); diff --git a/src/Event/Error.php b/src/Event/Error.php index dd0e17d..585e349 100644 --- a/src/Event/Error.php +++ b/src/Event/Error.php @@ -9,7 +9,7 @@ class Error extends Event { - public function __construct(public BaseConfig $config, public Driver $driver, public \Throwable $exception) + public function __construct(public BaseConfig $config, public Driver $driver, public \Throwable $exception,public bool $isPush = true) { parent::__construct($config, $driver); } diff --git a/src/Exception/EmptyDataException.php b/src/Exception/EmptyDataException.php new file mode 100644 index 0000000..13c67ba --- /dev/null +++ b/src/Exception/EmptyDataException.php @@ -0,0 +1,10 @@ +getDriver(); $driver->logger->error('job failed:' . $e->getMessage(), ['exception' => $e]); - $driver->event->dispatch(new Error($this->config, $driver, $e)); + $driver->event->dispatch(new Error($this->config, $driver, $e, false)); } abstract function handle(); diff --git a/src/Listener/ProgressListener.php b/src/Listener/ProgressListener.php index 5e97614..d64aacb 100644 --- a/src/Listener/ProgressListener.php +++ b/src/Listener/ProgressListener.php @@ -190,6 +190,8 @@ function error(object $event) $event->driver->progress->setProgress($event->config, new ProgressData([ 'status' => ProgressData::PROGRESS_STATUS_FAIL, ])); - $event->driver->progress->pushMessage($event->config->getToken(), $event->exception->getMessage()); + if($event->isPush){ + $event->driver->progress->pushMessage($event->config->getToken(), $event->exception->getMessage()); + } } } \ No newline at end of file