2016-03-23 20 views
1

PHP'den bir Excel dosyasına veri eklemeye çalışırken biraz sorun yaşıyorum. PHPExcel kullanıyorum ve kod aşağıda.PHP Excel dosyasına ekle

Sorun şu ki: Dosyalar yeterince küçük olduğunda harika çalışıyordu. Ama sonra dosyalar daha büyük olmaya başladı ve İzin verilen bellek boyutu bitkin hatası almaya başladı. Bu yüzden, dosyayı her zaman sıfırdan yazmak yerine, sadece yeni verileri alıp dosyaya ekleyeceğim. Ama bir sebepten dolayı dosyaya yazmıyor.

Herkesin bir fikri var mı?

function get_subscriptions($process, $filename){  
    /** Error reporting */ 
    error_reporting(E_ALL); 
    ini_set('display_errors', TRUE); 
    ini_set('display_startup_errors', TRUE); 
    date_default_timezone_set('Europe/London'); 
    //define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />'); 

    /** Include PHPExcel */ 
    require_once dirname(__FILE__) . '/PHPExcel.php'; 
    require_once dirname(__FILE__) . '/PHPExcel/IOFactory.php'; 

    // Create new PHPExcel object 
    //$objPHPExcel = new PHPExcel(); 

    $objPHPExcel = PHPExcel_IOFactory::load(dirname(__FILE__) . "/".$filename); 
    $objPHPExcel->setActiveSheetIndex(0); 
    $objSheet = $objPHPExcel->getActiveSheet(); 
    $last_line = $objSheet->getHighestRow()+1; 
    $last_id = $objSheet->getCellByColumnAndRow(0, $last_line)->getCalculatedValue(); 

    // Set document properties 
    $objPHPExcel->getProperties()->setCreator("FHGV") 
     ->setLastModifiedBy("FHGV") 
     ->setTitle("Report") 
     ->setSubject("PSS Report") 

    $objPHPExcel->setActiveSheetIndex(0) 
     ->setCellValue('A1', 'ID') 
     ->setCellValue('B1', 'Date') 
     ->setCellValue('C1', 'Name') 
     ->setCellValue('D1', 'CPF') 
     ->setCellValue('E1', 'RG') 
     ->setCellValue('F1', 'ZIP') 
     ->setCellValue('G1', 'Address') 
     ->setCellValue('H1', 'No') 
     ->setCellValue('I1', 'Reference') 
     ->setCellValue('J1', 'City') 
     ->setCellValue('K1', 'State') 
     ->setCellValue('L1', 'Other') 
     ->setCellValue('M1', 'Email') 
     ->setCellValue('N1', 'Phone') 
     ->setCellValue('O1', 'Cell Phone') 
     ->setCellValue('P1', 'Birth Date') 
     ->setCellValue('Q1', 'Company') 
     ->setCellValue('R1', 'Position') 

    global $wpdb; 
    $array = $wpdb->get_results("SELECT id, date_added as 'date', 
     (select value from wp_iphorm_form_entry_data dados where element_id = 1 and entry_id = id) as 'name' 
     ... 
    FROM wp_iphorm_form_entries subscription 
    WHERE subscription.post_title = \"".$process."\" AND id>".$last_id); 

    $row = $last_line+1; $col = 0; 
    foreach($array as $data){ 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->id); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->date); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->name); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->cpf); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->rg); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->zip); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->address); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->no); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->reference); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->city); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->state); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->others); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, strip_tags($data->email)); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->phone); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->cell_phone); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->birth_date); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->company); 
     $objSheet->setCellValueByColumnAndRow($col++, $row, $data->position); 
     $col=0;$row++; 
    } 

    for($col = 'A'; $col !== 'S'; $col++) { 
     $objPHPExcel->getActiveSheet() 
      ->getColumnDimension($col) 
      ->setAutoSize(true); 
    } 

    // Rename worksheet 
    $objSheet->setTitle('Subscriptions'); 

    // Save Excel 2007 file 
    $callStartTime = microtime(true); 
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 

    // Renaming the file and saving it 
    $objWriter->save(str_replace('functions.php', $filename , __FILE__)); 
    $callEndTime = microtime(true); 
    $callTime = $callEndTime - $callStartTime; 
} 
+0

Üzerinde çalıştığınız dosyanın bellek ayak izini azaltan belgelenmiş hücre önbelleğe alma yöntemlerinden herhangi birini kullanmayı düşündünüz mü? –

+0

Ben varsayılan olarak orada olduğunu 'cache_to_phpTemp' kullanıyordum sanırım. Bunu değiştirebileceğimi bilmiyordum. 'Cache_to_sqlite' olarak değiştirildi ve şu anda çalışıyor gibi görünüyor. Teşekkürler. Kullanışlı bulduğunuz herkes için şu bağlantıyı bulabilirsiniz: [link] (https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/04-Configuration-Settings.md) –

+0

Varsayılan aslında en hızlı erişim olan cache_in_memory', ama aynı zamanda en büyük bellek ayak izi –

cevap

0

Veri eklemeden önce, elektronik tablonun tamamını okuyorsunuz. Bu, PHPExcel'in bellekteki tüm verileri yüklediği anlamına gelir. Çok fazla veriye sahip olmamanız, ancak daha büyük e-tablolar için çalışmayı durdurması durumunda iyi çalışır. Programınız için yalnızca sınırlı miktarda bellek bulunduğundan, tüm veri kümesi belleğe sığmıyor ve bu nedenle programınız çöküyor.

Sen hücre önbelleğe alma bakmak gerekir: https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/04-Configuration-Settings.md#cell-caching

Alternatif olarak, Spout ile bunun nasıl bir göz alabilir. Emzik, özellikle bu bellek hatalarını çözmek için inşa edilmiştir. Belgeleri şu adreste bulabilirsiniz: https://github.com/box/spout/wiki/Add-data-to-an-existing-spreadsheet

+0

Teşekkürler. Belgelere bir göz attım ve önbellek ayarlarını 'cache_to_sqlite' olarak değiştirdim. Henüz sahip olduğum en büyük elektronik tablo üzerinde çalışıyor gibi görünüyor, ki bu yaklaşık 20 bin satır. –

İlgili konular