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 字节;我在 Excel 2002 中打开它

于 2008-10-28T17:43:42.923 回答
0

使用 PHPExcel 写入第 0 列 (A0) 时出现此错误。Excel 是 1-indexed (A1),这就是为什么它说“数据可能已丢失”。

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

$row被初始化为0

于 2009-11-02T11:40:43.630 回答