SpreadSheet_Excel_Writer로 Excel 파일을 생성 할 때 이상한 오류입니다

StackOverflow https://stackoverflow.com/questions/244110

  •  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으로 초기화되었습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top