2015-09-30 2 views
0

HI all expert Я новичок в php. может кто-нибудь сказать мне, чтобы ускорить PHPExcel, и это мой код, он читает 20000 строк с 4 столбцами. он занимает больше 15 секунд. спасибо большоекак ускорить PHPExcel reader

function upload_fl($FILES){ 

$file = $FILES['excel']; 

//echo getcwd(); 
//print_r($file); 

require 'phpexcel/PHPExcel.php'; 

if(move_uploaded_file($file['tmp_name'],'C:/wamp/www/datatable_017/php/upload/'.$file['name'])){ 

    $data = '../php/upload/'.$file['name']; 

    $objPHPExcel = PHPExcel_IOFactory::load($data); 
    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); 

    //var_dump($sheetData); 

    echo sizeof($sheetData); 
    //$writefile = fopen($FILES['excel']['name'].'.txt','w'); 
    /* 
    foreach($sheetData as $row){ 
     foreach($row as $col->$value){ 
      //$value_inser = (is_numeric($value) == true ? ''number',''.$value.'',''':''text','',''.$value.'''); 
      //fwrite($writefile,$cate_set_id[$col].','.$com_id.','.$year.','.$value_insert.'\n'); 
     } 
    } 
    --> 
    fclose($writefile); 
    */ 
    return 'upload/'.$file['name'].'.txt'; 
}else{ 
    return 'upload failed'; 
} 
}//function 
+0

csv будет быстрее –

+0

Мне пришлось манипулировать большими xls в прошлом. Вместо использования PHPExcel я преобразовал xls в csv, а затем прочитал его, используя классические функции php. Надеюсь, что помогает – mokk

+0

, но csv не поддерживает мой язык ... –

ответ

1

Если у вас есть несколько листов, но не нужно загружать все из них, то вы можете ограничить рабочие листы, что читатель будет загружать с помощью метода setLoadSheetsOnly(). Для загрузки одного имени рабочего листа:

$inputFileType = 'Excel5'; 
$inputFileName = './sampleData/example1.xls'; 
$sheetname = 'Data Sheet #2'; 
/** Create a new Reader of the type defined in $inputFileType **/ 
$objReader = PHPExcel_IOFactory::createReader($inputFileType); 
/** Advise the Reader of which WorkSheets we want to load **/ 
$objReader->setLoadSheetsOnly($sheetname); 
/** Load $inputFileName to a PHPExcel Object **/ 
$objPHPExcel = $objReader->load($inputFileName); 

Или вы можете указать несколько рабочих листов с одним вызовом setLoadSheetsOnly(), передавая массив имен:

$inputFileType = 'Excel5'; 
$inputFileName = './sampleData/example1.xls'; 
$sheetnames = array('Data Sheet #1','Data Sheet #3'); 
/** Create a new Reader of the type defined in $inputFileType **/ 
$objReader = PHPExcel_IOFactory::createReader($inputFileType); 
/** Advise the Reader of which WorkSheets we want to load **/ 
$objReader->setLoadSheetsOnly($sheetnames); 
/** Load $inputFileName to a PHPExcel Object **/ 
$objPHPExcel = $objReader->load($inputFileName); 

Если вам необходимо получить доступ к части только Рабочий лист, то вы можете определить фильтр чтения, чтобы определить, какие именно клетки вы на самом деле хотите загрузить:

$inputFileType = 'Excel5'; 
$inputFileName = './sampleData/example1.xls'; 
$sheetname = 'Data Sheet #3'; 

/** Define a Read Filter class implementing PHPExcel_Reader_IReadFilter */ 
class MyReadFilter implements PHPExcel_Reader_IReadFilter { 
    public function readCell($column, $row, $worksheetName = '') { 
     // Read rows 1 to 7 and columns A to E only 
     if ($row >= 1 && $row <= 7) { 
      if (in_array($column,range('A','E'))) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

/** Create an Instance of our Read Filter **/ 
$filterSubset = new MyReadFilter(); 
/** Create a new Reader of the type defined in $inputFileType **/ 
$objReader = PHPExcel_IOFactory::createReader($inputFileType); 
/** Advise the Reader of which WorkSheets we want to load 
    It's more efficient to limit sheet loading in this manner rather than coding it into a Read Filter **/ 
$objReader->setLoadSheetsOnly($sheetname); 
echo 'Loading Sheet using filter'; 
/** Tell the Reader that we want to use the Read Filter that we've Instantiated **/ 
$objReader->setReadFilter($filterSubset); 
/** Load only the rows and columns that match our filter from $inputFileName to a PHPExcel Object **/ 
$objPHPExcel = $objReader->load($inputFileName); 

Если вам не нужно загружать информацию форматирования, но только рабочий лист данные, то метод setReadDataOnly() покажет читателю только для загрузки значений ячеек, игнорируя формат ячейки:

$inputFileType = 'Excel5'; 
$inputFileName = './sampleData/example1.xls'; 
/** Create a new Reader of the type defined in $inputFileType **/ 
$objReader = PHPExcel_IOFactory::createReader($inputFileType); 
/** Advise the Reader that we only want to load cell data, not formatting **/ 
$objReader->setReadDataOnly(true); 
/** Load $inputFileName to a PHPExcel Object **/ 
$objPHPExcel = $objReader->load($inputFileName); 

хотя отмечают, что чтение только исходные данные, как это не позволит вам различать значения даты и плавает


Если вы хотите работать с большими файлами Excel, не построить большой PHP массива в памяти, делая что toArray() вызова, потому что это большие накладные расходы на использовании памяти, и есть также большая стоимость в производительности с постоянной необходимостью выделять все больше и больше памяти по мере создания массива ..... если вы собираетесь обрабатывать ro w за раз, используйте итераторы, встроенные в PHPExcel, или просто используйте цикл для доступа к каждой отдельной строке по очереди.

Смежные вопросы