这是代码。不是很多。

<?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的两个数据条目,(0,0和0,1)。

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

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

以下是问题的详细说明 。它与Perl Spreadsheet :: WriteExcel 模块(从中派生PHP模块)但推力相同。

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

生成的文件为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