2013-04-16 4 views
5

Я новичок в laravel и нелегко выясняю способ экспорта одной таблицы в csv. Я попытался следующий код в классе контроллера, но он дает мне ошибку:Экспорт всего стола в CSV с использованием 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'); 
} 

Модель класса для Cpmreport:

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

Ошибка:

Message: 

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

    Location: 

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

Любая помощь будет оценена.

+0

Возможный дубликат [Использовать Laravel для загрузки таблицы в формате CSV] (http://stackoverflow.com/questions/26146719/use-laravel-to-download-table-as-csv) - смотрите также протокол HTTPS: //meta.stackexchange.com/a/147651/321521 –

ответ

7

fputcsv($file, $table); должно быть fputcsv($file, $row), не так ли?

и преобразовать объект в массив с помощью метода 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

да, извините, что это была опечатка, но она все еще не работает с $ row – Anuj

+0

Посмотрите на метод 'to_array()' Eloquent. http://laravel.com/docs/database/eloquent#to-array – sqwk

+0

Много спасибо вам sqwk, это решение работало нормально. – Anuj

18

Легкий способ

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 = внутри foreach получает последнее значение – Hontoni

+0

Обратите внимание, что для получения '$ table' для этого требуется красноречивый запрос коллекции. '' DB: :('tablename') 'запрос должен быть запущен как красноречивый запрос и созданная модель (если она еще не была) –

+0

это полезно! спасибо! –

2

Выберите запрос данных MySQL.

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

Вызов следующие функции:

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 миллиона записей занимает 1 секунду, чтобы создать.

+0

У меня 5000 записей, но это занимает около 3-4 минут, используя Laravel 5 –

+0

Это не займет много времени. Может возникнуть проблема с правами доступа к файлам? @tiGer –

+0

Я напрямую загружаю файл, не понимаю о разрешениях файлов. –

0

Это лучше и проще.

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

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

  • Нет связанных вопросов^_^