2013-09-06 2 views
0

Excel을 업로드하고 데이터를 읽은 다음 DB에 쓰면됩니다. 나는 2mb 엑셀 파일로부터 데이터를 얻을 필요가있다. 나는 데이터를 읽을 때까지 코딩을 끝냈다. 엑셀을 업로드하는Excel에서 DB로 크기를 변경하는 PHP로 데이터 업로드

ini_set('memory_limit', '-1'); 

도 어떻게 든

set_time_limit(0); 

에 의해 관리도 실행 시간 문제를 사용하여 내가이 문제를 해결 한 몇 가지 문제

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20 bytes) 

가 도시 동안 때 문제입니다 300kb 이상의 엑셀 크기를 업로드하려고하는데, 실행을 완료하는 데 너무 많은 시간이 걸립니다. 누구든지 Excel에서 데이터를 읽는 가장 좋은 방법을 제안 할 수 있습니까? DB에 삽입하기 전에 값을 배열에 저장하면 성능 문제가 있습니까? 여기

추가 내 코드

<?php 

/** Include path **/ 
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/'); 

/** PHPExcel_IOFactory */ 
include 'PHPExcel/IOFactory.php'; 
include('../includes/class_read_xl.php'); 
$obj_read_xl=new class_read_xl(); 
if(isset($_POST["upload"])) { 
    move_uploaded_file($_FILES["ufile"]["tmp_name"], "../uploads/xlsheet/" . $_FILES["ufile"]["name"]); 
    $file = $_FILES['ufile']['name']; 
    $inputFileName = '../uploads/xlsheet/'.$file; 
    //$inputFileName = "test.xls"; 
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName); 
    $objReader = PHPExcel_IOFactory::createReader($inputFileType); 
    $objReader->setReadDataOnly(false); 
    // Load $inputFileName to a PHPExcel Object 
    $objPHPExcel = $objReader->load($inputFileName); 
    $total_sheets=$objPHPExcel->getSheetCount(); // here 4 
    $allSheetName=$objPHPExcel->getSheetNames(); // array ([0]=>'student',[1]=>'teacher',[2]=>'school',[3]=>'college') 
    //print_r($allSheetName); 
    $objWorksheet = $objPHPExcel->setActiveSheetIndex(0); // first sheet 
    $highestRow = $objWorksheet->getHighestRow(); // here 5 
    $highestColumn = $objWorksheet->getHighestColumn(); // here 'E' 
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // here 5 
    //exit(); 
    $arr_data=array(); 
    for ($row = 1; $row <= $highestRow; ++$row) { 
    for ($col = 0; $col <= $highestColumnIndex; ++$col) { 
     $value = $objWorksheet->getCellByColumnAndRow($col, $row)->getValue(); 
     if(is_array($arr_data)) { 
      $arr_data[$row-1][$col]=$value; 
     } 
     } 
    } 

    print_r($arr_data);  
} 
?> 
+1

'ini_set (' memory_limit ','-1 ');'정말 나쁜 생각입니다! –

+0

코드를 게시하지 않으면 도움을 드릴 수 없습니다. –

답변

0

이 같은 PHPExcel 설명서에 설명되어 세포 캐싱 또는 "청크", 등의 방법을 절약 권장 메모리 중 하나를 사용하고있는 것처럼 보이지 않는다 - 참조 개발자 문서의 섹션 4.2.1 (제목 : "셀 캐싱") 및 읽기 스프레드 시트 파일에 대한 사용자 설명서의 다양한 섹션

실제로 파일의 단일 워크 시트에서 데이터를 읽는 경우 워크 시트 한 개, 전체 네 개가 아닙니다

배열에 값을 저장하면 배열의 메모리도 차지하므로 스크립트의 메모리 요구량이 크게 증가합니다. 그러나 행의 모든 ​​셀을 개별적으로 읽는 대신 각 행에 대해 rangeToArray() 메서드를 사용할 수 있습니다. 큰 메모리 오버 헤드가 발생하지 않으며 각 개별 셀을 읽는 것보다 빠릅니다.

+0

재생 해 주셔서 감사합니다. – Shafeeque

관련 문제