SpreadSheet_Excel_Writer로 Excel 파일을 생성 할 때 이상한 오류입니다
-
04-07-2019 - |
문제
코드는 다음과 같습니다. 그다지 많지 않습니다.
<?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 그룹에서. 아래로 스크롤하십시오. 마지막 게시물입니다 미가 그것은 문제를 언급합니다.
그리고 여기에 수정이 있습니다
<?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
비 초기화되지 않으므로 Row 0을 덮어 씁니다.
이는 생성 된 Excel 파일이 셀 A1 및 B1에 대한 2 개의 데이터 항목, (0, 0 및 0, 1)를 포함한다는 것을 의미합니다.
사무실 서비스 팩 3 이전에는 문제가되지 않았습니다. 그러나 SP3가 설치되면 Excel은 셀의 중복 항목이 발생하면 "데이터가 손실되었을 수 있습니다"라는 경고가 발생합니다.
일반적인 해결책은 하나 이상의 데이터를 셀에 쓰지 않는 것입니다. :-)
여기 더 있습니다 상해 문제의. 그것은 perl과 관련이 있습니다 스프레드 시트 :: WriteExcel 모듈 (PHP 모듈이 도출 된)이지만 추력은 동일합니다.
흠 방금 테스트하도록 설치했고 오류가 발생하지 않았습니다.
생성 된 파일은 3,584 바이트이고; Excel 2002에서 열었습니다
phpexcel을 사용하여 0 (a0)에 쓸 때이 오류가 발생했습니다. Excel은 1- 인덱스 (A1)이므로 "데이터가 손실되었을 수 있습니다"라고 말했습니다.
$this->m_excel->getActiveSheet()->SetCellValue($chr[$col].$row, $data));
$row
0으로 초기화되었습니다