엑셀 다운로드 반복문 사용여부 문의드립니다. 채택완료
엑셀 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개
$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개
댓글을 작성하려면 로그인이 필요합니다.
headers already sent by <===에러 문구에도 나와 있듯이
header~~~이 코드는 loop를 돌면서 실행 할 수 있는 코드가 아닙니다
다운 링크가 있는 페이지에서 count($row) <== 이 값을 구해서
ajax로 반복하든지, 링크 갯수를 count만큼 나오게 만들든지 하면 되겠는데....
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인