Spreadsheet_Excel_WriterでExcelファイルを作成する際の奇妙なエラー
-
04-07-2019 - |
質問
これがコードです。大したことない。
<?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();
?>
問題は、Excelで実際にファイルを開くと、次のエラーが表示されることです。
File error: data may have been lost.
見知らぬ人でさえ、エラーにもかかわらず、ファイルは問題ないようです。書き込み中のデータはすべてそこにあります。
このエラーを取り除く方法についてのアイデアはありますか?
編集
問題をわかりやすくするために、コードサンプルを変更しました。最初のサンプルは合法的なテストではないと思います。
解決
質問のコードには、エラーの原因となるバグがあります。
この行は、一連の列名を行0に書き込みます
$sheet->writeRow(0, 0, $colNames, $colHeadingFormat);
次に、値の行を書き出すことになっているループがあります。
for($i=1; $i<=10; $i++)
{
$row = array( "foo $i", "bar $i");
$sheet->writeRow($rowNumber++, 0, $row);
}
問題は、 $ rowNumber がどこにも宣言されていないため、ループの最初のパスで行0が上書きされることです。
この上書きにより、Excel Writerで問題が発生するようです。
奇妙なことに、エラーが発生したExcelファイルには、技術的に上書きされているにもかかわらず、列名のある行が表示されます。
解決策は Googleグループで見つかりました。下にスクロールします。この問題について言及しているのは、 Micah による最後の投稿です。
これが修正です
<?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();
?>
他のヒント
Mark Biekが主な問題を指摘しているように、 $ rowNumber
は初期化されていないため、行0が上書きされます。
これは、生成されたExcelファイルに、セルA1とB1の2つのデータエントリ(0、0、0、1)が含まれることを意味します。
これは、Office Service Pack 3以前の問題ではありませんでした。ただし、SP3をインストールすると、「データが失われた可能性があります」というエラーが発生します。セルのエントリが重複している場合は警告します。
一般的な解決策は、1つのセルに複数のデータを書き込まないことです。 :-)
問題の詳細な説明 。 Perl Spreadsheet :: WriteExcel モジュール(PHPモジュールの派生元)ですが、推力は同じです。
うーん、テスト用にインストールしただけでエラーは発生しませんでした。
生成されたファイルは3,584バイトでした。 Excel 2002で開きました
PHPExcelで列0(A0)に書き込むときにこのエラーが発生しました。 Excelは1インデックス(A1)であるため、「データが失われた可能性がある」と述べています。
$this->m_excel->getActiveSheet()->SetCellValue($chr[$col].$row, $data));
$ row
は0に初期化されました