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

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

QA

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

본문

엑셀 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만큼 나오게 만들든지 하면 되겠는데....

 

답변을 작성하시기 전에 로그인 해주세요.
전체 61,268
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT