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

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
엑셀 다운로드 반복문 사용여부 문의드립니다.

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

 

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

회원로그인

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