erro estranho ao criar arquivos do Excel com Spreadsheet_Excel_Writer
-
04-07-2019 - |
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.
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