2013-04-16 12 views
5

Sono nuovo di laravel e ho difficoltà a trovare un modo per esportare una tabella in csv. Ho provato il seguente codice nella classe controller, ma mi dà un errore:Esporta tutta la tabella in CSV utilizzando laravel

public function get_export() 
{ 
    $table = Cpmreport::all(); 
    $file = fopen('file.csv', 'w'); 
    foreach ($table as $row) { 
     fputcsv($file, $row); 
    } 
    fclose($file); 
    return Redirect::to('consolidated'); 
} 

Classe Modello per Cpmreport:

class Cpmreport extends Eloquent 
    { 
     public static $table='cpm_report'; 
    } 

L'errore:

Message: 

    fputcsv() expects parameter 2 to be array, object given 

    Location: 

    C:\xampp\htdocs\cpm_report\application\controllers\cpmreports.php on line 195 

Qualsiasi aiuto sarebbe apprezzato.

+0

Eventuali duplicati di [Usa laravel da scaricare tabella come CSV] (http://stackoverflow.com/questions/26146719/use-laravel-to-download-table-as-csv) - vedi https anche: //meta.stackexchange.com/a/147651/321521 –

risposta

7

fputcsv($file, $table); dovrebbe essere fputcsv($file, $row), non dovrebbe?

E convertire l'oggetto in un array utilizzando il metodo del eloquente to_array(): http://laravel.com/docs/database/eloquent#to-array

public function get_export() 
{ 
    $table = Cpmreport::all(); 
    $file = fopen('file.csv', 'w'); 
    foreach ($table as $row) { 
     fputcsv($file, $row->to_array()); 
    } 
    fclose($file); 
    return Redirect::to('consolidated'); 
} 
+0

sì, mi dispiace che fosse un errore di battitura, ma non funziona ancora con $ row – Anuj

+0

Dai un'occhiata al metodo 'to_array()' di Eloquent. http://laravel.com/docs/database/eloquent#to-array – sqwk

+0

Molte grazie a voi sqwk, questa soluzione ha funzionato bene. – Anuj

18

Modo semplice

Route::get('/csv', function() { 
    $table = Cpmreport::all(); 
    $output=''; 
    foreach ($table as $row) { 
     $output.= implode(",",$row->toArray()); 
    } 
    $headers = array(
     'Content-Type' => 'text/csv', 
     'Content-Disposition' => 'attachment; filename="ExportFileName.csv"', 
); 

    return Response::make(rtrim($output, "\n"), 200, $headers); 
}); 
+1

$ output = inside foreach ottiene l'ultimo valore – Hontoni

+0

Si noti che ciò richiede una query di raccolta eloquente per ottenere il '$ table'. Una 'DB: :('tablename')' la query dovrà essere eseguita come una query eloquente e un modello creato (se non lo è già stato) –

+0

questo è utile! grazie! –

2

query di selezione dei dati di MySQL.

$data = \DB::connection('mysql')->select($select); 

chiamata seguente funzione:

query_to_csv($data, 'data.csv'); 

function data_to_csv($data, $filename) 
    { 
     $fp = fopen($filename, 'w'); 
     foreach ($data as $row) { 
      fputcsv($fp, $row); 
     } 

     fclose($fp); 
    } 

0,1 milioni di dischi prende 1 secondo per creare.

+0

Ho 5000 record ma richiede circa 3-4 minuti usando Laravel 5 –

+0

Non ci vuole molto tempo. Potrebbe esserci un problema con i permessi dei file? @tiGer –

+0

Sto scaricando direttamente il file, non capisco le autorizzazioni dei file. –

0

questo è migliore e semplice.

$file_name = "abc"; 
$postStudent = Input::all(); 
$ck = DB::table('loan_tags')->select('LAN')->where('liabilitiesId', $postStudent['id'])->get(); 
$i = 0; 
foreach ($ck as $row) { 

       $apps[$i]['LAN'] = $row->LAN; 
      $apps[$i]['Account_number'] = $postStudent['account_number']; 
      $apps[$i]['Bank_Name'] = $postStudent['bank_name']; 
      $i++; 
} 

ob_end_clean(); 
ob_start(); 
Excel::create($file_name, function($excel) use($apps){ 
     $excel->sheet('Sheetname', function($sheet) use($apps){ 

      $sheet->row(1, array(
       'LAN', 'Account number' , 'Bank Name' 
      )); 
      $k = 2; 
      foreach ($apps as $deta) { 
       $sheet->row($k, array($deta['LAN'], $deta['Account_number'], $deta['Bank_Name'] 
       )); 
       $k++; 
      } 
     }); 
    })->download('xlsx'); 
Problemi correlati