Domanda

Ecco il codice. Non molto.

<?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();
?>

Il problema è che ottengo il seguente errore quando apro effettivamente il file con Excel:

File error:  data may have been lost.

Ancora più strano è il fatto che, nonostante l'errore, il file sembra a posto. Tutti i dati che mi capita di scrivere sono lì.

Qualche idea su come eliminare questo errore?


Modifica

Ho modificato l'esempio di codice per illustrare meglio il problema. Non credo che il primo campione sia stato un test legittimo.

È stato utile?

Soluzione

Il codice nella domanda ha un bug che causa l'errore.

Questa riga scrive un gruppo di nomi di colonne nella riga 0

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

Quindi abbiamo il ciclo che dovrebbe scrivere le righe del valore.

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

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

Il problema è che $ rowNumber non è dichiarato da nessuna parte, quindi sovrascrive la riga 0 al primo passaggio attraverso il ciclo.

Questa sovrascrittura sembra causare un problema con Excel Writer.

La cosa strana è che, nel file Excel che riporta l'errore, vedi ancora la riga con i nomi delle colonne anche se tecnicamente è stata sovrascritta.

Ho trovato la soluzione qui su Google Gruppi . Scorri verso il basso. È l'ultimo post di Micah a menzionare il problema.


Ed ecco la correzione

<?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();
?>

Altri suggerimenti

Come sottolinea Mark Biek, il problema principale è che $ rowNumber non è inizializzato e come tale sovrascrive la riga 0.

Ciò significa che il file Excel generato conterrà 2 voci di dati per le celle A1 e B1, (0, 0 e 0, 1).

Questo non era un problema prima di Office Service Pack 3. Tuttavia, una volta installato SP3 Excel genererà un "dati che potrebbero essere andati persi" avviso se rileva voci duplicate per una cella.

La soluzione generale è non scrivere più di un dato in una cella. : -)

Ecco una spiegazione dettagliata del problema . È in relazione al Perl Spreadsheet :: WriteExcel modulo (da cui deriva il modulo PHP) ma la spinta è la stessa.

Hmm l'ho appena installato per testare e non ho ricevuto un errore - ha detto Foo come dovrebbe.

Il file generato era di 3.584 byte; L'ho aperto in Excel 2002

Ho ricevuto questo errore durante la scrittura nella colonna 0 (A0) con PHPExcel. Excel è 1-indicizzato (A1), ecco perché ha detto che "i dati potrebbero essere andati persi".

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

$ row è stato inizializzato su 0

scroll top