2016-03-23 14 views
1

PHPからExcelファイルにデータを追加しようとして少し問題があります。私はPHPExcelを使用しており、コードは以下のとおりです。PHP Excelファイルに追加

問題は次のとおりです。ファイルが十分に小さくなっていたら、うまくいきました。しかし、その後ファイルが大きくなり始め、私は許容メモリサイズを使い果たしました。ですから、毎回新しいデータだけを取得してファイルに追加するたびに、ファイルを最初から書き込むのではなく、しかし何らかの理由でファイルに書き込んでいるわけではありません。

アイデアはありますか?

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

作業中のファイルのメモリフットプリントを減らす文書化されたセルキャッシング方法の使用を検討しましたか? –

+0

私は 'cache_to_phpTemp'を使っていました。私はそれを変えることができるのか分からなかった。 'cache_to_sqlite'に変更されました。それは今働いているようです。ありがとう。ここで役に立つ部分は、ドキュメントの[link](https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/04-Configuration-Settings.md)のリンクを参照してください。 –

+0

デフォルト実際には最も速いアクセスであるcache_in_memoryですが、最大のメモリーフットプリントでもあります –

答えて

0

データを追加する前に、スプレッドシート全体を読み込みます。つまり、PHPExcelはすべてのデータをメモリにロードします。あまりデータがなくても、大きなスプレッドシートでは機能しなくなるとうまくいきます。 プログラムに使用できるメモリの量が限られているため、データセット全体がメモリに収まらないため、プログラムがクラッシュします。

あなたは、セルのキャッシングを見てみる必要があります。https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/04-Configuration-Settings.md#cell-caching

あるいは、スパウトでこれを行う方法を見てみることができます。 Spoutは、これらのメモリ不足エラーを解決するために特別に作られました。ここでドキュメントを見つけることができます:https://github.com/box/spout/wiki/Add-data-to-an-existing-spreadsheet

+0

ありがとうございます。私はドキュメンテーションを見て、キャッシュ設定を 'cache_to_sqlite'に変更しました。私がまだ持っている最大のスプレッドシート(​​約20k行)に取り組んでいるようだ。 –

関連する問題