2013-04-16 42 views
5

Tôi mới sử dụng Laravel và có một thời gian khó khăn để tìm ra cách để xuất một bảng sang csv. Tôi đã thử đoạn mã sau trong lớp điều khiển, nhưng nó mang lại cho tôi một lỗi:Xuất toàn bộ bảng sang CSV bằng cách sử dụng 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'); 
} 

Mẫu Class cho Cpmreport:

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

Lỗi:

Message: 

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

    Location: 

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

Bất kỳ sự giúp đỡ sẽ được đánh giá cao.

+0

có thể trùng lặp của [Sử dụng Laravel để Tải bảng như CSV] (http://stackoverflow.com/questions/26146719/use-laravel-to-download-table-as-csv) - xem thêm https: //meta.stackexchange.com/a/147651/321521 –

Trả lời

7

fputcsv($file, $table); phải là fputcsv($file, $row), phải không?

Và chuyển đổi các đối tượng đến một mảng sử dụng phương pháp to_array() hùng biện của: 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

có, xin lỗi đó là lỗi đánh máy, nhưng nó vẫn không hoạt động với $ row – Anuj

+0

Hãy xem phương thức 'to_array()' của Eloquent. http://laravel.com/docs/database/eloquent#to-array – sqwk

+0

Rất cám ơn bạn sqwk, giải pháp này làm việc tốt. – Anuj

18

Cách dễ dàng

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 nhận giá trị cuối cùng – Hontoni

+0

Lưu ý rằng điều này đòi hỏi một truy vấn thu thập hùng hồn để có được '$ table'. Một truy vấn 'DB: :('tablename')' sẽ cần phải được chạy như một truy vấn hùng hồn và một mô hình được tạo ra (nếu nó chưa được) –

+0

điều này hữu ích! cảm ơn bạn! –

2

Chọn truy vấn dữ liệu MySQL.

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

Gọi chức năng sau:

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 triệu hồ sơ mất 1 giây để tạo ra.

+0

Tôi có 5000 hồ sơ nhưng việc lấy khoảng 3-4 phút bằng cách sử dụng Laravel 5 –

+0

Nó không mất nhiều thời gian. Có thể có vấn đề với quyền truy cập tệp? @tiGer –

+0

Tôi đang trực tiếp tải xuống tệp, không hiểu về quyền đối với tệp. –

0

điều này là tốt hơn và đơn giản.

$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');