Spreadsheet_Excel_WriterでExcelファイルを作成する際の奇妙なエラー

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

  •  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に初期化されました

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top