Frage

Hier ist der Code. Nicht viel zu.

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

Das Problem ist, dass ich die folgende Fehlermeldung erhalten, wenn ich öffne die Datei tatsächlich mit Excel:

File error:  data may have been lost.

Noch seltsamer ist die Tatsache, dass trotz der Fehler, die Datei scheint in Ordnung. Alle Daten, die ich passieren zu schreiben ist da.

Alle Ideen, wie dieser Fehler loszuwerden?


Bearbeiten

Ich habe das Codebeispiel modifiziert, um das Problem besser darzustellen. Ich glaube nicht, die erste Probe ein legit Test war.

War es hilfreich?

Lösung

Der Code in der Frage hat einen Fehler, der den Fehler verursacht hat.

Diese Zeile schreibt eine Reihe von Spaltennamen 0 bis Zeile

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

Dann haben wir die Schleife, die die Wertereihen schreiben soll.

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

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

Das Problem ist, dass $ rowNumber ist nicht überall so erklärt es die Zeile 0 auf dem ersten Durchgang durch die Schleife überschreibt.

Dieses Überschreiben scheint ein Problem mit Excel Writer zu führen.

Das Merkwürdige ist, dass auf der Excel-Datei, die den Fehler verursacht, noch Sie die Zeile mit den Spaltennamen sehen, obwohl es ist technisch überschrieben wurde.

ich die Lösung gefunden hier auf Google Groups . Blättern Sie nach unten. Es ist der letzte Beitrag von Micah , das das Problem erwähnt.


Und hier ist das Update

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

Andere Tipps

Als Mark Biek das Hauptproblem weist darauf hin, dass $rowNumber uninitialised ist und als solche überschreibt Zeile 0.

Das bedeutet, dass die erzeugte Excel-Datei 2 Dateneinträge für die Zellen A1 und B1 enthalten, (0, 0 und 0, 1).

Dies war kein Problem, vor dem Office Service Pack 3. Sobald jedoch SP3 Excel erhöht installiert ist eine „Daten möglicherweise verloren gegangen“ Warnung, wenn es doppelte Einträge für eine Zelle trifft.

Die allgemeine Lösung ist nicht mehr als ein Datum in einer Zelle zu schreiben. : -)

Hier ist eine detaillierte Erklärung der Ausgabe . Es ist in Bezug auf die Perl Kalkulationstabelle :: WriteExcel Modul (von dem das PHP-Modul abgeleitet wird), aber der Schub ist das gleiche.

Hmm ich installiert es nur zu testen und habe nicht einen Fehler -. Gesagt Foo, wie es sollte

Die Datei generiert wird, war 3584 Bytes; Ich öffnete es in Excel 2002

Ich habe diesen Fehler, wenn auf Spalte 0 (A0) mit PHPExcel zu schreiben. Excel ist 1-indiziert (A1), das ist, warum es die „Daten möglicherweise verloren gegangen“.

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

$row wurde auf 0 initialisiert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top