使用Spreadsheet_Excel_Writer创建Excel文件时出现奇怪错误

时间:2008-10-28 17:14:09

标签: php export-to-excel pear

这是代码。不是很多。

<?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 个答案:

答案 0 :(得分:6)

问题中的代码有一个导致错误的错误。

这一行将一堆列名写入第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文件中,即使技术上被覆盖,您仍会看到包含列名的行。

我找到了解决方案here on 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();
?>

答案 1 :(得分:4)

正如Mark Biek所指出的那样,主要问题是$rowNumber未被初始化,因此会覆盖第0行。

这意味着生成的Excel文件将包含单元格A1和B1的两个数据条目,(0,0和0,1)。

在Office Service Pack 3之前,这不是问题。但是,一旦安装了SP3,如果遇到单元格的重复条目,Excel将引发“数据可能已丢失”警告。

一般解决方案是不向单元格写入多个数据。 : - )

这是问题的更多detailed explanation。它与Perl Spreadsheet::WriteExcel模块(从中派生PHP模块)相关,但推力相同。

答案 2 :(得分:1)

嗯,我刚安装它进行测试并没有收到错误 - 它说Foo应该这样。

生成的文件为3,584字节;我在Excel 2002中打开它

答案 3 :(得分:0)

使用PHPExcel写入第0列(A0)时出现此错误。 Excel是1索引(A1),这就是它说“数据可能已丢失”的原因。

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

$row初始化为0