엑셀 다운로드 반복문 사용여부 문의드립니다.
본문
엑셀 row를 한번에 1만건 이상 한 파일에 받게되면 메모리 사용량이 큰거같아 1000건씩 끊어서 10개로 나눠서 받으려고 아래와같이 로직을 짯는데 한번 다운로드하고 이후 작업이 되지않아서요.. 파일도 정상적으로 열리지 않구요 ㅠ
제가 원하는 방향으로 진행할 수 있을까요?
* 반복문을 제거하면 정상적으로 다운로드는 됩니다.
$row = 10;
for($i=0; $i<=count($row); $i++) {
//엑셀 시트 코드 생략
$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');
}
관련 에러 내용 :
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); // 전체 레코드 수
for ($i = 0; $i < $totalRecords; $i += $recordsPerFile) {
// 새 스프레드시트 객체 생성
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 데이터 삽입
for ($j = 0; $j < $recordsPerFile; $j++) {
if ($i + $j >= $totalRecords) break; // 범위를 초과하지 않도록
// 예시로 데이터를 넣는 부분
$sheet->setCellValue('A' . ($j + 1), $row[$i + $j]);
}
// 파일명 설정
$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');
// 파일 저장
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
// 메모리 해제
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
// 다음 파일 전송 후 종료
exit; // 첫 번째 파일이 다운로드된 후 스크립트 종료
}
이렇게 한번 해보시죠.^^ !-->
메모리 사용량 제한 해제 방법을 추천합니다.
1~2만건 정도는 그렇게 큰 데이터는 아니라고 생각합니다.
제일 상단에 다음 코드 추가
ini_set('memory_limit', '-1');
headers already sent by <===에러 문구에도 나와 있듯이
header~~~이 코드는 loop를 돌면서 실행 할 수 있는 코드가 아닙니다
다운 링크가 있는 페이지에서 count($row) <== 이 값을 구해서
ajax로 반복하든지, 링크 갯수를 count만큼 나오게 만들든지 하면 되겠는데....
답변을 작성하시기 전에 로그인 해주세요.