使用 Laravel 将表格下载为 CSV 格式

2022-08-30 10:40:39

我正在尝试将数据库表导出为文件。我希望用户能够选择该按钮并将表格下载为文件。目前我已经得到了这个代码,但它不起作用:LaravelcsvExport as CSVcsv

我的按钮:

<a href="/all-tweets-csv" class="btn btn-primary">Export as CSV</a>

我的路线:

Route::get('/all-tweets-csv', function(){

    $table = Tweet::all();
    $filename = "tweets.csv";
    $handle = fopen($filename, 'w+');
    fputcsv($handle, array('tweet text', 'screen name', 'name', 'created at'));

    foreach($table as $row) {
        fputcsv($handle, array($row['tweet_text'], $row['screen_name'], $row['name'], $row['created_at']));
    }

    fclose($handle);

    $headers = array(
        'Content-Type' => 'text/csv',
    );

    return Response::download($handle, 'tweets.csv', $headers);
});

它返回我这个错误:

 The file "Resource id #154" does not exist

我收集到这是因为它正在尝试下载一个不存在的文件。有没有另一种方法可以修改我的代码,以便下载为.csv


答案 1

我在这里偶然发现,试图看看Laravel是否默认内置了一些东西 - 这个问题的答案让我有点担心。我同意@andré-daniel的观点,即正确的方法是不先写入文件,但他的实现是手动将值放在一起,如果任何值包含引号,空格等,这将失败。

这是一个更健壮的解决方案,使用Laravel和php来正确格式化每行(将转义引号,并引用必要的字符串 http://php.net/manual/en/function.fputcsv.phpResponse::streamfputcsv

<?php

public function download()
{
    $headers = [
            'Cache-Control'       => 'must-revalidate, post-check=0, pre-check=0'
        ,   'Content-type'        => 'text/csv'
        ,   'Content-Disposition' => 'attachment; filename=galleries.csv'
        ,   'Expires'             => '0'
        ,   'Pragma'              => 'public'
    ];

    $list = User::all()->toArray();

    # add headers for each column in the CSV download
    array_unshift($list, array_keys($list[0]));

   $callback = function() use ($list) 
    {
        $FH = fopen('php://output', 'w');
        foreach ($list as $row) { 
            fputcsv($FH, $row);
        }
        fclose($FH);
    };

    return response()->stream($callback, 200, $headers)
}

答案 2

除了这行,几乎所有东西都很好:

return Response::download($handle, 'tweets.csv', $headers);

应将此行更改为:

return Response::download($filename, 'tweets.csv', $headers);

推荐