Pergunta

Aqui está o código. Não há muito a ele.

<?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();
?>

O problema é que eu recebo o seguinte erro quando eu realmente abrir o arquivo com o Excel:

File error:  data may have been lost.

Ainda mais estranho é o fato de que, apesar do erro, o arquivo parece bem. Quaisquer dados que venham a ser escrita é lá.

Algumas ideias sobre como se livrar deste erro?


Editar

Eu modificado o código de exemplo para ilustrar melhor o problema. Eu não acho que a primeira amostra foi um teste legítimo.

Foi útil?

Solução

O código em questão tem um bug que causa o erro.

Esta linha escreve um monte de nomes de colunas para a linha 0

$sheet->writeRow(0, 0, $colNames, $colHeadingFormat);

Em seguida, temos o loop que é suposto para escrever as linhas de valor.

for($i=1; $i<=10; $i++)
{
    $row = array( "foo $i", "bar $i");

    $sheet->writeRow($rowNumber++, 0, $row);
}

O problema é que $ RowNumber não está declarado em qualquer lugar, ele substitui fileira 0 na primeira passagem pelo loop.

Esta substituição parece causar um problema com o Excel Writer.

O estranho é que, no arquivo do Excel que dá o erro, você ainda vê a linha com os nomes das colunas mesmo que seja tecnicamente sido substituído.

Eu encontrei a solução aqui na Grupos Google . Desça até a parte inferior. É o último post por Micah que menciona a questão.


E aqui está a correção

<?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();
?>

Outras dicas

Como pontos Mark Biek o problema principal é que $rowNumber é uninitialised e, como tais substituições linha 0.

Isto significa que o ficheiro Excel gerado conterá 2 entradas de dados para as células de A1 e B1, (0, 0 e 0, 1).

Este não era um problema antes do Office Service Pack 3. No entanto, uma vez que o SP3 está instalado Excel irá emitir um aviso "de dados pode ter sido perdida" se encontrar entradas duplicadas para uma célula.

A solução geral é a de não escrever um ou mais dados a uma célula. : -)

Aqui está uma mais explicação detalhada do problema . É em relação ao Perl Spreadsheet :: WriteExcel módulo (a partir do qual o módulo é derivado PHP), mas a pressão é o mesmo.

Hmm Acabei de instalar-lo para teste e não obter um erro -. Disse Foo como deveria

O arquivo gerado foi de 3.584 bytes; Abri-lo no Excel 2002

Eu tenho esse erro ao escrever para a coluna 0 (A0) com PHPExcel. Excel é 1-indexados (A1), é por isso que disse que "os dados podem ter sido perdidos".

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

$row foi inicializado para 0

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top