Laravel-excel: Erro ao abrir arquivo com o Excel. Possíveis dados corrompidos ou extensão de arquivo inválida.

Criado em 24 mai. 2018  ·  15Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Pré-requisitos

  • [x] Capaz de reproduzir o comportamento fora do seu código, o problema é isolado no Laravel Excel.
  • [x] Verificou se seu problema ainda não foi arquivado.
  • [x] Verificado se nenhum PR foi enviado que corrige este problema.

Versões

  • Versão PHP: 7.1
  • Versão do Laravel: 5.5. *
  • Versão do pacote: ^ 3.0

Descrição

Baixando arquivo de um método FromQuery .... downloads de arquivo, ao abrir o arquivo XLSX, recebe uma mensagem de erro do Office:
"O Excel não pode abrir o arquivoporque o formato do arquivo ou a extensão do arquivo não é válido. Verifique se o arquivo não foi corrompido e se a extensão do arquivo corresponde ao formato do arquivo "

Passos para reproduzir

Aqui está o meu método

namespace Modules\Profile\Exports;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Modules\Profile\Entities\Profile;

class ProfileExport implements FromQuery
{
    use Exportable;

    public function __construct($range)
    {
        $this->start = $range['start'];
        $this->end = $range['end'];
    }

    public function query()
    {
      return Profile::query()->where('created_at', '>=', $this->start . ' 00:00:00')
                             ->where('created_at', '<=', $this->end . ' 23:59:59')
                             ->whereHas('user.roles', function($query){
                                  $query->where('id', 2);
                             });
    }
}

Eu chamo assim de um controlador

//$request->start = '2018-01-01';
//$request->end = '2018-05-01';

$range = ['start'=>$request->start, 'end'=>$request->end];
return (new ProfileExport($range))->download($request->start . '-' . $request->end .'-pet-parent-signups.xlsx');

Comportamento esperado:

O arquivo a ser baixado com dados

Comportamento real:

O arquivo é baixado, mas o Excel dá erro ao abri-lo

informação adicional

Testei a consulta no eloquent e ela retorna uma coleção com dados.

(https://user-images.githubusercontent.com/18451450/40511758-f61e6570-5f5d-11e8-9f37-0b594f60be59.png)

Comentários muito úteis

Olá a todos,

Passei o dia tentando entender essa função de download impraticável. PHPSpreadSheet parece usar um buffer de PHP. E dependendo da configuração do PHP, alguns avisos ou erros podem interferir na saída.

Usando :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

resolve para mim.
Talvez deva ajudar algumas pessoas.

Obrigado por esta biblioteca incrível.

Todos 15 comentários

Também agradeço antecipadamente :)

Especialmente por ter tempo para escrever este invólucro para começar

Não tenho certeza se ainda é o mesmo problema com o PhpSpreadsheet, mas o PHPExcel teve problemas com espaços ( ) na frente de <?php tags abertas. Isso costumava causar esse erro no passado.

u pode abrir arquivo de erro com nano ou vim.
Se você vir um espaço antes de PK, assim:
image
Talvez tenha ocorrido um erro em seu código ou fornecedor. Eu encontrei o mesmo problema e lidei com a remoção da pasta do fornecedor. Funciona bem depois de reinstalar o fornecedor

Olá a todos, obrigado pela liderança.

Acho que você está correto ao dizer que há uma quebra de linha extra ou algo no início do arquivo. Ainda não rastreei, mas quando mudo para CSV, posso abrir o arquivo e os dados estão lá, mas a primeira linha está em branco ...

Vou procurar mais um pouco, vou relatar de volta. Eu procurei por um arquivo começando com uma quebra de linha e então

Vou encerrar e abrir um novo com uma descrição melhor do problema. Não consigo encontrar a fonte da linha em branco

eu encontrei o mesmo problema. eu consertei por

  • Excel :: armazenar para armazenar arquivo no servidor
  • return redirect (Storage :: url ("storage / {$ filename}"));
    amostra
    `` `
    exportação de função pública (solicitação $ solicitação)
    {
    $filename = 'meal_list_'.date('YmdHis').'.xlsx';
     Excel::store(new MealExport($request), $filename, 'public');
     return redirect( Storage::url("storage/{$filename}" ));
}

Olá a todos,

Passei o dia tentando entender essa função de download impraticável. PHPSpreadSheet parece usar um buffer de PHP. E dependendo da configuração do PHP, alguns avisos ou erros podem interferir na saída.

Usando :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

resolve para mim.
Talvez deva ajudar algumas pessoas.

Obrigado por esta biblioteca incrível.

Olá a todos,

Passei o dia tentando entender essa função de download impraticável. PHPSpreadSheet parece usar um buffer de PHP. E dependendo da configuração do PHP, alguns avisos ou erros podem interferir na saída.

Usando :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

resolve para mim.
Talvez deva ajudar algumas pessoas.

Obrigado por esta biblioteca incrível.

Muito obrigado a sua resposta perfeita

Olá a todos,

Esta solução:

ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

Funciona e resolve o problema de corrupção. Mas ainda tem problemas com a exportação usando Xlsx / Xls.
O arquivo baixado tem a seguinte aparência:
image

Alguma ideia de como consertar isso?

THX !

Olá a todos,

Passei o dia tentando entender essa função de download impraticável. PHPSpreadSheet parece usar um buffer de PHP. E dependendo da configuração do PHP, alguns avisos ou erros podem interferir na saída.

Usando :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

resolve para mim.
Talvez deva ajudar algumas pessoas.

Obrigado por esta biblioteca incrível.

Te amo cara .. Você salvou minha cabeça ...

Não tenho certeza se ainda é o mesmo problema com o PhpSpreadsheet, mas o PHPExcel teve problemas com espaços ( ) na frente de <?php tags abertas. Isso costumava causar esse erro no passado.

Olá @patrickbrouwers
Obrigado por seu comentário.
Resolve para mim.

Se você estiver usando ajax para fazer download,
adicione responseType: 'blob' à sua solicitação de ajax (estou usando axios)

Meu código de exemplo:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

Sem responseType: 'blob' , o arquivo baixado não pode ser aberto

Se você estiver usando ajax para fazer download,
adicione responseType: 'blob' à sua solicitação de ajax (estou usando axios)

Meu código de exemplo:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

Sem responseType: 'blob' , o arquivo baixado não pode ser aberto

Obrigado!! salve minha vida, fico olhando para qual linha de código php que corrompeu meu arquivo exportado. Acontece que é axios

Olá a todos,

Passei o dia tentando entender essa função de download impraticável. PHPSpreadSheet parece usar um buffer de PHP. E dependendo da configuração do PHP, alguns avisos ou erros podem interferir na saída.

Usando :

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

resolve para mim.
Talvez deva ajudar algumas pessoas.

Obrigado por esta biblioteca incrível.

Obrigado @Leenzuur , você salvou meu dia! Funcionou! Gostaria de saber se há algum para consertar isso, mas do jeito @Leenzuur , você sabe o que quero dizer, se eu tiver 10 classes de exportação para 10 modelos, quando fizer o download, tenho que adicionar em 10 lugares.

Esse problema começou a acontecer comigo hoje sem nenhuma alteração em nenhuma exportação. O uso de amostra de código @leenzuur corrigiu o problema após horas de pesquisa.

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