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 arquivo
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
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)
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:
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
$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:
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,
adicioneresponseType: '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.
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 :
resolve para mim.
Talvez deva ajudar algumas pessoas.
Obrigado por esta biblioteca incrível.