3

これがコードです。それほど多くはありません。

<?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.

さらに奇妙なのは、エラーにもかかわらず、ファイルは問題ないように見えるという事実です。私がたまたま書いているデータはそこにあります。

このエラーを取り除く方法についてのアイデアはありますか?


編集

問題をよりよく説明するために、コード サンプルを変更しました。最初のサンプルは正当なテストではなかったと思います。

4

4 に答える 4

7

問題のコードには、エラーの原因となるバグがあります。

この行は、一連の列名を行 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 Groups で解決策を見つけました。一番下までスクロールします。この問題について言及したのは、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();
?>
于 2008-10-28T18:54:01.267 に答える
4

Mark Biek が指摘しているように、主な問題は$rowNumber初期化されていないため、行 0 を上書きすることです。

これは、生成された Excel ファイルには、セル A1 と B1 の 2 つのデータ エントリ (0, 0 と 0, 1) が含まれることを意味します。

これは、Office Service Pack 3 より前は問題ではありませんでした。ただし、SP3 をインストールすると、Excel でセルの重複エントリが検出されると、「データが失われた可能性があります」という警告が表示されます。

一般的な解決策は、セルに複数のデータを書き込まないことです。:-)

ここでは、問題の詳細な説明を示します。これは Perl Spreadsheet::WriteExcelモジュール (PHP モジュールの派生元) に関連していますが、推力は同じです。

于 2008-11-03T10:58:04.590 に答える
1

うーん、テストのためにインストールしたところ、エラーは発生しませんでした。Foo と表示されるはずです。

生成されたファイルは 3,584 バイトでした。Excel2002で開いてみた

于 2008-10-28T17:43:42.923 に答える
0

PHPExcel で列 0 (A0) に書き込むと、このエラーが発生しました。Excel は 1 インデックス (A1) であるため、「データが失われた可能性があります」と表示されます。

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

$row0 に初期化されました

于 2009-11-02T11:40:43.630 に答える