Erreur étrange lors de la création de fichiers Excel avec Spreadsheet_Excel_Writer

StackOverflow https://stackoverflow.com/questions/244110

  •  04-07-2019
  •  | 
  •  

Question

Voici le code. Pas grand chose à ça.

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

Le problème est que j'obtiens l'erreur suivante lorsque j'ouvre le fichier avec Excel:

File error:  data may have been lost.

Encore plus étrange est le fait que, malgré l'erreur, le fichier semble bien. Toutes les données que j’écris sont là.

Des idées sur la façon de se débarrasser de cette erreur?

Modifier

J'ai modifié l'exemple de code pour mieux illustrer le problème. Je ne pense pas que le premier échantillon était un test légitime.

Était-ce utile?

La solution

Le code de la question comporte un bogue qui cause l'erreur.

Cette ligne écrit un tas de noms de colonnes dans la ligne 0

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

Nous avons ensuite la boucle qui est supposée écrire les lignes de valeur.

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

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

Le problème est que $ rowNumber n'est pas déclaré nulle part, il remplace donc la ligne 0 lors du premier passage dans la boucle.

Cet écrasement semble causer un problème avec Excel Writer.

Ce qui est étrange, c’est que, dans le fichier Excel qui donne l’erreur, vous voyez toujours la ligne avec les noms de colonne même si elle a été écrasée techniquement.

J'ai trouvé la solution ici sur Google Groupes . Descendez en bas de page. C'est le dernier message de Micah qui mentionne le problème.

Et voici le correctif

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

Autres conseils

Comme Mark Biek l’a souligné, le problème principal est que $ rowNumber n’est pas initialisé et qu’il écrase ainsi la ligne 0.

Cela signifie que le fichier Excel généré contiendra 2 entrées de données pour les cellules A1 et B1 (0, 0 et 0, 1).

Cela n'était pas un problème avant Office Service Pack 3. Cependant, une fois le SP3 installé, Excel générera une "donnée peut-être perdue". avertissement s’il rencontre des entrées en double pour une cellule.

La solution générale est de ne pas écrire plus d’une donnée dans une cellule. : -)

Voici une explication détaillée du problème . C’est en relation avec le feuille de calcul :: WriteExcel

Hmm, je viens de l'installer pour tester et je n'ai pas d'erreur - il dit Foo comme il se doit.

Le fichier généré faisait 3,584 octets; Je l'ai ouvert dans Excel 2002

J'ai eu cette erreur lors de l'écriture dans la colonne 0 (A0) avec PHPExcel. Excel est indexé 1 (A1), c’est la raison pour laquelle il est indiqué que "les données ont peut-être été perdues".

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

$ row a été initialisé à 0

scroll top