Descarga de archivo desde un método FromQuery .... descargas de archivos, al abrir el archivo XLSX, recibe un mensaje de error de Office:
"Excel no puede abrir el archivo
Aqui esta mi metodo
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);
});
}
}
Lo llamo así desde un 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');
Comportamiento esperado:
El archivo que se descargará con los datos.
Comportamiento real:
El archivo se descarga pero Excel da error al abrirlo
He probado la consulta en elocuente y devuelve una colección con datos.
(https://user-images.githubusercontent.com/18451450/40511758-f61e6570-5f5d-11e8-9f37-0b594f60be59.png)
También gracias de antemano :)
Especialmente por tomarse el tiempo para escribir esta envoltura para empezar.
No estoy seguro de si sigue siendo el mismo problema con PhpSpreadsheet, pero PHPExcel tuvo problemas con tener espacios ( ) delante de
<?php
etiquetas abiertas. Eso solía causar este error en el pasado.
Puede abrir el archivo de error con nano o vim.
Si ve un espacio antes de PK, simplemente así:
Quizás ocurrió un error en su código o proveedor. Me encontré con el mismo problema y me ocupo de eliminar la carpeta del proveedor. Funciona bien después de reinstalar el proveedor
Hola a todos, gracias por el liderazgo.
Creo que tiene razón en que hay un salto de línea adicional o algo al principio del archivo. Todavía no lo he rastreado, pero cuando cambio a CSV, puedo abrir el archivo y los datos están allí, pero la primera fila está en blanco ...
Yendo a buscar un poco más, les informaré. Busqué un archivo que comenzaba con un salto de línea y luego
Voy a cerrar esto y abrir uno nuevo con una mejor descripción del problema. No puedo encontrar la fuente de la fila en blanco
Me encontré con el mismo problema. Lo arreglé por
$filename = 'meal_list_'.date('YmdHis').'.xlsx';
Excel::store(new MealExport($request), $filename, 'public');
return redirect( Storage::url("storage/{$filename}" ));
}
Hola a todos,
Me paso el día para comprender esta función de descarga que no funciona. PHPSpreadSheet parece usar un búfer PHP. Y dependiendo de su configuración de PHP, algunas advertencias o errores podrían interferir con la salida.
Utilizando :
// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');
resuelve por mí.
Quizás debería ayudar a algunas personas.
Gracias por esta increíble biblioteca.
Hola a todos,
Me paso el día para comprender esta función de descarga que no funciona. PHPSpreadSheet parece usar un búfer PHP. Y dependiendo de su configuración de PHP, algunas advertencias o errores podrían interferir con la salida.
Utilizando :
// in controller ob_end_clean(); // this ob_start(); // and this return Excel::download(new MyExport, 'file.xls');
resuelve por mí.
Quizás debería ayudar a algunas personas.Gracias por esta increíble biblioteca.
Muchas gracias por su perfecta respuesta.
Hola a todos,
Esta solución :
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');
Funciona y soluciona el problema corrupto. Pero todavía tengo problemas para exportar usando Xlsx / Xls.
El archivo descargado tiene este aspecto:
Algúna idea de cómo arreglar esto ?
Gracias !
Hola a todos,
Me paso el día para comprender esta función de descarga que no funciona. PHPSpreadSheet parece usar un búfer PHP. Y dependiendo de su configuración de PHP, algunas advertencias o errores podrían interferir con la salida.
Utilizando :
// in controller ob_end_clean(); // this ob_start(); // and this return Excel::download(new MyExport, 'file.xls');
resuelve por mí.
Quizás debería ayudar a algunas personas.Gracias por esta increíble biblioteca.
Te amo hombre ... Me salvaste la cabeza ...
No estoy seguro de si sigue siendo el mismo problema con PhpSpreadsheet, pero PHPExcel tuvo problemas con tener espacios (
) delante de
<?php
etiquetas abiertas. Eso solía causar este error en el pasado.
Hola @patrickbrouwers
Gracias por tu comentario.
Resuelve por mí.
Si está utilizando ajax para descargar,
por favor agregue responseType: 'blob'
a su solicitud ajax (estoy usando axios)
Mi código de ejemplo:
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);
}
})
Sin responseType: 'blob'
, el archivo descargado no se puede abrir
Si está utilizando ajax para descargar,
por favor agregueresponseType: 'blob'
a su solicitud ajax (estoy usando axios)Mi código de ejemplo:
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); } })
Sin
responseType: 'blob'
, el archivo descargado no se puede abrir
¡¡Gracias!! salva mi vida, sigo mirando qué línea de código php dañó mi archivo exportado ... resulta que es axios
Hola a todos,
Me paso el día para comprender esta función de descarga que no funciona. PHPSpreadSheet parece usar un búfer PHP. Y dependiendo de su configuración de PHP, algunas advertencias o errores podrían interferir con la salida.
Utilizando :
// in controller ob_end_clean(); // this ob_start(); // and this return Excel::download(new MyExport, 'file.xls');
resuelve por mí.
Quizás debería ayudar a algunas personas.Gracias por esta increíble biblioteca.
Gracias @Leenzuur , ¡me salvaste el día! ¡Funcionó! Me pregunto si hay alguno para solucionar esto, pero @Leenzuur , ya sabes a lo que me refiero, si tengo 10 clases de exportación para 10 modelos, cuando descargo, tengo que agregar en 10 lugares.
Este problema comenzó a sucederme hoy sin cambios en ninguna exportación. El uso de la muestra de código @leenzuur lo solucionó después de horas de investigación.
Comentario más útil
Hola a todos,
Me paso el día para comprender esta función de descarga que no funciona. PHPSpreadSheet parece usar un búfer PHP. Y dependiendo de su configuración de PHP, algunas advertencias o errores podrían interferir con la salida.
Utilizando :
resuelve por mí.
Quizás debería ayudar a algunas personas.
Gracias por esta increíble biblioteca.