这是代码。不是很多。
<?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 :(得分: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