Si intentas crear un archivo de Excel con gráficos usando phpexcel con symfony (o php simple) y el archivo descargado está dañado, este artículo puede ser útil para resolver tu problema.

¿Su archivo de Excel generado por PHPExcel no funciona cuando se abre con Microsoft Excel (el formato de archivo o la extensión no son válidos)? Si eres víctima de este horrible problema, hay muchos factores que pueden causar este mensaje.

Si está usando php simple y usa el siguiente código:

$excelWriter->save("php://output");

Mark Baker (el desarrollador de PHPOffice) dijo:

verifique su secuencia de comandos para ver dónde se puede enviar a la transmisión php://output. Compruebe que no haya espacio antes de su etiqueta <?php de apertura inicial ; tenga especial cuidado con las etiquetas de cierre / apertura ?> <?php o similares. Y también verifique cualquier archivo que pueda estar incluido en su script.

Leer más aquí

Y ese es un punto difícil de lograr, porque es difícil verificar qué archivos tienen espacios entre las etiquetas (y si usa un marco como Symfony ... será una tarea difícil de lograr), sin embargo, algunos desarrolladores resolvieron este problema usando :

ob_end_clean(); // ob_end_clean Cleans the output buffer and turn off output buffering
$excelWriter->save("php://output");

Si la solución anterior no funcionó para usted, solo le queda 1 opción, pero antes de continuar, debe saber un par de notas importantes:

  • Una respuesta transmitida generará un archivo corrupto casi siempre.
  • Es posible que PHPExcel no sea el único culpable del archivo corrupto; en la mayoría de los casos, su código (la forma en que dibuja los datos) puede ser el corrupto.
  • Guarde el archivo en algún lugar de su servidor usando el método de guardar, luego genere una descarga del archivo (directa o indirecta) si es necesario.

El siguiente código creará un archivo de Excel con un ejemplo de gráfico básico que no se dañará, pruébelo:

// Elimine el \ antes de cada clase si está usando php simple (nuevo \ PHP_Something)
public function createexcelfileAction() {
        // si está usando php simple en su lugar,
        //$excel = new PHPExcel();
 
        $excel = $this->get('phpexcel')->createPHPExcelObject();

        $excel->createSheet();
        $excel->setActiveSheetIndex(1);
        $excel->getActiveSheet()->setTitle('ChartTest');


        $objWorksheet = $excel->getActiveSheet();
        $objWorksheet->fromArray(
                array(
                    array('', 'Rainfall (mm)', 'Temperature (°F)', 'Humidity (%)'),
                    array('Jan', 78, 52, 61),
                    array('Feb', 64, 54, 62),
                    array('Mar', 62, 57, 63),
                    array('Apr', 21, 62, 59),
                    array('May', 11, 75, 60),
                    array('Jun', 1, 75, 57),
                    array('Jul', 1, 79, 56),
                    array('Aug', 1, 79, 59),
                    array('Sep', 10, 75, 60),
                    array('Oct', 40, 68, 63),
                    array('Nov', 69, 62, 64),
                    array('Dec', 89, 57, 66),
                )
        );


        //  Establecer las etiquetas para cada serie de datos que queremos trazar
        //      Datatype
        //      Cell reference for data
        //      Format Code
        //      Number of datapoints in series
        //      Data values
        //      Data Marker
        $dataseriesLabels1 = array(
            new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$B$1', NULL, 1), //  Temperature
        );
        $dataseriesLabels2 = array(
            new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$C$1', NULL, 1), //  Rainfall
        );
        $dataseriesLabels3 = array(
            new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$D$1', NULL, 1), //  Humidity
        );

        //  Establecer las etiquetas del eje X
        //      Datatype
        //      Cell reference for data
        //      Format Code
        //      Number of datapoints in series
        //      Data values
        //      Data Marker
        $xAxisTickValues = array(
            new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$A$2:$A$13', NULL, 12), //  Jan to Dec
        );


        //  Establecer los valores de datos para cada serie de datos que queremos trazar
        //      Datatype
        //      Cell reference for data
        //      Format Code
        //      Number of datapoints in series
        //      Data values
        //      Data Marker
        $dataSeriesValues1 = array(
            new \PHPExcel_Chart_DataSeriesValues('Number', 'Grafico!$B$2:$B$13', NULL, 12),
        );

        //  Construye la serie de datos
        $series1 = new \PHPExcel_Chart_DataSeries(
                \PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType
                \PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED, // plotGrouping
                range(0, count($dataSeriesValues1) - 1), // plotOrder
                $dataseriesLabels1, // plotLabel
                $xAxisTickValues, // plotCategory
                $dataSeriesValues1                              // plotValues
        );
        //  Establecer parámetros de serie de datos adicionales
        //      Conviértalo en una columna vertical en lugar de un gráfico de barras horizontal
        $series1->setPlotDirection(\PHPExcel_Chart_DataSeries::DIRECTION_COL);


        //  Establecer los valores de datos para cada serie de datos que queremos trazar
        //      Datatype
        //      Cell reference for data
        //      Format Code
        //      Number of datapoints in series
        //      Data values
        //      Data Marker
        $dataSeriesValues2 = array(
            new \PHPExcel_Chart_DataSeriesValues('Number', 'Grafico!$C$2:$C$13', NULL, 12),
        );

        //  Construye la serie de datos
        $series2 = new \PHPExcel_Chart_DataSeries(
                \PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType
                \PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping
                range(0, count($dataSeriesValues2) - 1), // plotOrder
                $dataseriesLabels2, // plotLabel
                NULL, // plotCategory
                $dataSeriesValues2                              // plotValues
        );


        //  Establecer los valores de datos para cada serie de datos que queremos trazar
        //      Datatype
        //      Cell reference for data
        //      Format Code
        //      Number of datapoints in series
        //      Data values
        //      Data Marker
        $dataSeriesValues3 = array(
            new \PHPExcel_Chart_DataSeriesValues('Number', 'Grafico!$D$2:$D$13', NULL, 12),
        );

        //  Construye la serie de datos
        $series3 = new \PHPExcel_Chart_DataSeries(
                \PHPExcel_Chart_DataSeries::TYPE_AREACHART, // plotType
                \PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping
                range(0, count($dataSeriesValues2) - 1), // plotOrder
                $dataseriesLabels3, // plotLabel
                NULL, // plotCategory
                $dataSeriesValues3                              // plotValues
        );


        //  Establecer la serie en el área de la trama
        $plotarea = new \PHPExcel_Chart_PlotArea(NULL, array($series1, $series2, $series3));
        //  Establecer la leyenda del gráfico
        $legend = new \PHPExcel_Chart_Legend(\PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false);

        $title = new \PHPExcel_Chart_Title('Chart awesome');

        //  Crea el gráfico
        $chart = new \PHPExcel_Chart(
                'chart1', // name
                $title, // title
                $legend, // legend
                $plotarea, // plotArea
                true, // plotVisibleOnly
                0, // displayBlanksAs
                NULL, // xAxisLabel
                NULL            // yAxisLabel
        );

        //  Establezca la posición donde debe aparecer el gráfico en la hoja de trabajo
        $chart->setTopLeftPosition('F2');
        $chart->setBottomRightPosition('O16');

        //  Agregue el gráfico a la hoja de trabajo
        $objWorksheet->addChart($chart);
        


        // si está usando php simple, use en su lugar:
        // $writer = new PHPExcel_Writer_Excel2007($excel);
        $writer = $this->get('phpexcel')->createWriter($excel, 'Excel2007');
        $writer->setIncludeCharts(TRUE);

        // Guarde el archivo en algún lugar de su proyecto
        $writer->save('file.xlsx');
        // entonces su archivo ya no estará dañado

        // ¡No use respuestas transmitidas con archivos de Excel que incluyan gráficos! de lo contrario se corromperá
        /**
          $response = $this->get('phpexcel')->createStreamedResponse($writer);
          // agregando encabezados
          $dispositionHeader = $response->headers->makeDisposition(
          ResponseHeaderBag::DISPOSITION_ATTACHMENT,
          'stream-file.xlsx'
          );
          $response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8');
          $response->headers->set('Pragma', 'public');
          $response->headers->set('Cache-Control', 'maxage=1');
          $response->headers->set('Content-Disposition', $dispositionHeader);
        **/

        // DEBE DAR SU PROPIA RESPUESTA, DE LO CONTRARIO ESTO PRODUCIRÁ ERROR
        return 'Create your own response';
}

Si todo salió bien, el archivo de Excel generado será un archivo de Excel normal con el siguiente contenido (y ningún mensaje de archivo dañado):

PHPExcel chart success

Todo debería estar en orden ahora, sin embargo, debe probar su código guardando el archivo con el método de guardar en lugar de una respuesta transmitida.

Si su archivo aún está dañado, definitivamente debe reevaluar su código y verificar que está procesando con datos sensoriales porque ese puede ser el problema.


Puede obtener más ejemplos de gráficos si visita el repositorio oficial de phpexcel github aquí , hay muchos ejemplos de cómo usar diferentes tipos de gráficos. Que la fuerza esté con usted !


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores