Laravel-excel: [Pergunta] Como pular linhas vazias (3.1)

Criado em 29 out. 2018  ·  12Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

  • Versão do pacote: 3.1

Descrição

Como pular linhas vazias no documento?

more information needed

Comentários muito úteis

Olá,
Eu tentei usar $row->filter()->isNotEmpty() mas devido ao fato de eu usar WithValidation os códigos param com um erro de validação. Minhas regras ficam assim:

public function rules(): array { return [ 'name' => 'required', '*.name' => 'required', 'email' => 'required|email', '*.email' => 'required|email', 'discount' => 'nullable|numeric', '*.discount' => 'nullable|numeric', ]; }

Infelizmente, se você tiver um arquivo excel e excluir o conteúdo de algumas linhas no final do arquivo excel, o Laravel-Excel ainda as reconhece como não vazias. Em seguida, a validação falha. Eu quero pular essas linhas antes da validação.

Todos 12 comentários

Obrigado por enviar o boleto. Infelizmente as informações que você forneceu estão incompletas. Precisamos saber qual versão você usa e como reproduzi-la. Por favor, inclua exemplos de código. Antes que possamos pegá-lo, verifique (https://github.com/Maatwebsite/Laravel-Excel/blob/3.0/.github/ISSUE_TEMPLATE.md) e adicione as informações que faltam. Para tornar o processamento deste ticket muito mais fácil, certifique-se de verificar (https://laravel-excel.maatwebsite.nl/docs/3.0/getting-started/contributing) e verifique novamente se você preencheu o modelo de problema corretamente. Isso nos permitirá retirar seu bilhete com mais eficiência. Questões que seguem as diretrizes corretamente terão prioridade sobre outras questões.

Duplicata de #1834

use o método ToCollection para envolver tudo dentro de if($row->filter()->isNotEmpty())
```
coleção de função pública (Coleção $ linhas)
{
foreach($linhas como $linha) {
if($row->filter()->isNotEmpty()){
// sua lógica pode ir aqui

            $user = User::create([
                'name' => ucwords($row['name']),
                'class' => $row['class'],
                ...
            ]);
        }
    }   
}

```

Como funciona o modo toModel?

Você pode retornar null em toModel, pulará essas linhas.

Olá,
Eu tentei usar $row->filter()->isNotEmpty() mas devido ao fato de eu usar WithValidation os códigos param com um erro de validação. Minhas regras ficam assim:

public function rules(): array { return [ 'name' => 'required', '*.name' => 'required', 'email' => 'required|email', '*.email' => 'required|email', 'discount' => 'nullable|numeric', '*.discount' => 'nullable|numeric', ]; }

Infelizmente, se você tiver um arquivo excel e excluir o conteúdo de algumas linhas no final do arquivo excel, o Laravel-Excel ainda as reconhece como não vazias. Em seguida, a validação falha. Eu quero pular essas linhas antes da validação.

@seven21 , você encontrou uma solução para isso? alguém conseguiu resolver esse problema?

Eu uso uma solução alternativa que ajuda no meu caso. A validação é estendida por nullable em todas as linhas para evitar erros e, em seguida, no método que adicionei
public function model(array $row) {if(!array_filter($row)) { return null;} return new Customer([..... e pule essas linhas neste momento. Não estou muito feliz com isso, pois não posso retornar uma mensagem de erro útil, mas como não encontrei solução, a melhor maneira de executar o código.

@seven21 Muito obrigado por sua instância e mensagem útil, mas também estou pensando que essa não é uma boa maneira se realmente usarmos validações.

@mohamednizar como você resolveu esse problema?

Não resolvi o problema completamente, mas para minha solução adicionei as seguintes funções personalizadas para retornar o tamanho do lote e o limite de linha. o limite de linhas só será contado se existirem dados na coluna.

 public function limit(): int {
        $highestColumn = $this->worksheet->getHighestDataColumn(3);
        $higestRow = 0;
        for ($row = $this->startRow(); $row <= $this->highestRow; $row++) {
            $rowData = $this->worksheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            if (isEmptyRow(reset($rowData))) {
                continue;
            } else {
                $higestRow += 1;
            }
        }
        return $higestRow;
    }

   public function batchSize(): int {
        $highestColumn = $this->worksheet->getHighestDataColumn(3);
        $higestRow = 1;
        for ($row = $this->startRow(); $row <= $this->highestRow; $row++) {
            $rowData = $this->worksheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            if (isEmptyRow(reset($rowData))) {
                continue;
            } else {
                $higestRow += 1;
            }
        }
        if ($higestRow == 0) {
            exit;
        } else {
            return $higestRow;
        }
    }

Algum tempo isso pode ajudá-lo a resolver algum tipo de problema.

você pode ignorar a linha vazia atualizando o arquivo config/excel.php.

a partir de:

        /*
        |--------------------------------------------------------------------------
        | Ignore Empty
        |--------------------------------------------------------------------------
        |
        | When dealing with imports, you might be interested in ignoring
        | rows that have null values or empty strings. By default rows
        | containing empty strings or empty values are not ignored but can be
        | ignored by enabling the setting ignore_empty to true.
        |
        */
        'ignore_empty' => false,

para:

        /*
        |--------------------------------------------------------------------------
        | Ignore Empty
        |--------------------------------------------------------------------------
        |
        | When dealing with imports, you might be interested in ignoring
        | rows that have null values or empty strings. By default rows
        | containing empty strings or empty values are not ignored but can be
        | ignored by enabling the setting ignore_empty to true.
        |
        */
        'ignore_empty' => true,

Esta página foi útil?
0 / 5 - 0 avaliações