Pregunta

Aquí está el código. No mucho para eso.

<?php
include("Spreadsheet/Excel/Writer.php");

$xls = new Spreadsheet_Excel_Writer();

$sheet = $xls->addWorksheet('At a Glance');

$colNames = array('Foo', 'Bar');
$sheet->writeRow(0, 0, $colNames, $colHeadingFormat);

for($i=1; $i<=10; $i++)
{
    $row = array( "foo $i", "bar $i");

    $sheet->writeRow($rowNumber++, 0, $row);
}

header ("Expires: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
$xls->send("test.xls");
$xls->close();
?>

El problema es que recibo el siguiente error cuando realmente abro el archivo con Excel:

File error:  data may have been lost.

Incluso más extraño es el hecho de que, a pesar del error, el archivo parece estar bien. Todos los datos que estoy escribiendo están ahí.

¿Alguna idea sobre cómo deshacerse de este error?


Editar

He modificado el ejemplo de código para ilustrar mejor el problema. No creo que la primera muestra fuera una prueba legítima.

¿Fue útil?

Solución

El código en la pregunta tiene un error que causa el error.

Esta línea escribe un montón de nombres de columnas en la fila 0

$sheet->writeRow(0, 0, $colNames, $colHeadingFormat);

Luego tenemos el bucle que se supone que escribe las filas de valores.

for($i=1; $i<=10; $i++)
{
    $row = array( "foo $i", "bar $i");

    $sheet->writeRow($rowNumber++, 0, $row);
}

El problema es que $ rowNumber no se declara en ninguna parte, por lo que sobrescribe la fila 0 en el primer paso a través del bucle.

Esta sobrescritura parece causar un problema con Excel Writer.

Lo extraño es que, en el archivo de Excel que da el error, sigue viendo la fila con los nombres de las columnas, aunque técnicamente se haya sobrescrito.

Encontré la solución aquí en Grupos de Google . Desplácese hasta la parte inferior. Es la última publicación de Micah que menciona el problema.


Y aquí está la solución

<?php
include("Spreadsheet/Excel/Writer.php");

$xls = new Spreadsheet_Excel_Writer();

$rowNumber = 0;
$sheet = $xls->addWorksheet('At a Glance');

$colNames = array('Foo', 'Bar');
$sheet->writeRow($rowNumber, 0, $colNames, $colHeadingFormat);

for($i=1; $i<=10; $i++)
{
    $rowNumber++;
    $row = array( "foo $i", "bar $i");

    $sheet->writeRow($rowNumber, 0, $row);
}

header ("Expires: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
$xls->send("test.xls");
$xls->close();
?>

Otros consejos

Como señala Mark Biek, el principal problema es que $ rowNumber no está inicializado y, como tal, sobrescribe la fila 0.

Esto significa que el archivo Excel generado contendrá 2 entradas de datos para las celdas A1 y B1, (0, 0 y 0, 1).

Esto no fue un problema antes de Office Service Pack 3. Sin embargo, una vez que se instaló el SP3, Excel generará un " los datos pueden haberse perdido " advertencia si encuentra entradas duplicadas para una celda.

La solución general es no escribir más de un dato en una celda. :-)

Aquí hay más explicación detallada del problema . Está relacionado con Perl Spreadsheet :: WriteExcel (del cual se deriva el módulo PHP) pero el empuje es el mismo.

Hmm, lo acabo de instalar para probar y no obtuve ningún error, dijo que Foo debería hacerlo.

El archivo generado fue de 3.584 bytes; Lo abrí en Excel 2002

Recibí este error al escribir en la columna 0 (A0) con PHPExcel. Excel es 1-indexado (A1), por eso dijo que "los datos pueden haberse perdido".

$this->m_excel->getActiveSheet()->SetCellValue($chr[$col].$row, $data));

$ row se inicializó a 0

scroll top