Laravel-excel: Error al abrir el archivo con Excel. Posibles datos corruptos o extensión de archivo incorrecta.

Creado en 24 may. 2018  ·  15Comentarios  ·  Fuente: Maatwebsite/Laravel-Excel

Prerrequisitos

  • [x] Capaz de reproducir el comportamiento fuera de su código, el problema está aislado en Laravel Excel.
  • [x] Verificó que su problema aún no se haya presentado.
  • [x] Se verificó si no se envió ningún RP que solucione este problema.

Versiones

  • Versión de PHP: 7.1
  • Versión de Laravel: 5.5. *
  • Versión del paquete: ^ 3.0

Descripción

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 archivoporque el formato del archivo o la extensión del archivo no es válido. Verifique que el archivo no esté dañado y que la extensión del archivo coincida con el formato del archivo "

Pasos para reproducir

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

información adicional

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)

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 :

// 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.

Todos 15 comentarios

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í:
image
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

  • Excel :: almacenar para almacenar el archivo en el servidor
  • return redirect (Storage :: url ("almacenamiento / {$ nombre de archivo}"));
    muestra
    ''
    exportación de función pública (Solicitud $ solicitud)
    {
    $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:
image

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 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

¡¡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.

¿Fue útil esta página
0 / 5 - 0 calificaciones