테스트 사이트 - 개발 중인 베타 버전입니다

엑셀 다운로드 반복문 사용여부 문의드립니다. 채택완료

sir생님 1년 전 조회 3,697

엑셀 row를 한번에 1만건 이상 한 파일에 받게되면 메모리 사용량이 큰거같아 1000건씩 끊어서 10개로 나눠서 받으려고 아래와같이 로직을 짯는데 한번 다운로드하고 이후 작업이 되지않아서요.. 파일도 정상적으로 열리지 않구요 ㅠ

제가 원하는 방향으로 진행할 수 있을까요?

 

* 반복문을 제거하면 정상적으로 다운로드는 됩니다.

 

</p>

<p>$row = 10;</p>

<p>for($i=0; $i<=count($row); $i++) {</p>

<p>//엑셀 시트 코드 생략</p>

<pre>
$filename = $today."_".$menu_coworker_name."_".$i.".xlsx";
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
$writer->save('php://output');
</pre>

<p>}</p>

<p>

 

관련 에러 내용 :

 

 PHP Warning:  Cannot modify header information - headers already sent by (output started at ...)

 

검색하면서 ob_start(); 라는 문구도 추가해보고, php.ini 의 output_buffering = On 도 수정해보았습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트
1년 전

$row = range(1, 10000); // 예시로 10,000건의 데이터 배열 생성

$recordsPerFile = 1000; // 한 파일당 레코드 수

$totalRecords = count($row); // 전체 레코드 수</p>

<p>for ($i = 0; $i < $totalRecords; $i += $recordsPerFile) {

    // 새 스프레드시트 객체 생성

    $spreadsheet = new Spreadsheet();

    $sheet = $spreadsheet->getActiveSheet();</p>

<p>    // 데이터 삽입

    for ($j = 0; $j < $recordsPerFile; $j++) {

        if ($i + $j >= $totalRecords) break; // 범위를 초과하지 않도록</p>

<p>        // 예시로 데이터를 넣는 부분

        $sheet->setCellValue('A' . ($j + 1), $row[$i + $j]); 

    }</p>

<p>    // 파일명 설정

    $filename = $today . "_" . $menu_coworker_name . "_" . ($i / $recordsPerFile) . ".xlsx";

    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

    header('Content-Disposition: attachment; filename="' . $filename . '"');

    header('Cache-Control: max-age=0');</p>

<p>    // 파일 저장

    $writer = new Xlsx($spreadsheet);

    $writer->save('php://output');</p>

<p>    // 메모리 해제

    $spreadsheet->disconnectWorksheets();

    unset($spreadsheet);</p>

<p>    // 다음 파일 전송 후 종료

    exit; // 첫 번째 파일이 다운로드된 후 스크립트 종료

}</p>

<p>
이렇게 한번 해보시죠.^^

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

s
sir생님
9개월 전
정말 감사합니다! 해결했어요 ㅠㅠㅠ

댓글을 작성하려면 로그인이 필요합니다.

1년 전

headers already sent by <===에러 문구에도 나와 있듯이 

header~~~이 코드는 loop를 돌면서 실행 할 수 있는 코드가 아닙니다

 

다운 링크가 있는 페이지에서 count($row) <== 이 값을 구해서

ajax로 반복하든지, 링크 갯수를 count만큼 나오게 만들든지 하면 되겠는데....

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

1년 전

메모리 사용량 제한 해제 방법을 추천합니다. 1~2만건 정도는 그렇게 큰 데이터는 아니라고 생각합니다. 제일 상단에 다음 코드 추가 ini_set('memory_limit', '-1');

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인