【问题标题】:Codeigniter and generating CSV filesCodeigniter 和生成 CSV 文件
【发布时间】:2014-11-24 08:11:52
【问题描述】:

这本身不是问题,更多的是请求从 Codeigniter 将查询导出为可下载 CSV 的最佳方式。在 CI 中,我从控制器(例如成员)中的模型调用一个简单查询(例如 select * from members where country=123),大致如下:

$data['membercountries_query'] = $this -> Queries_model -> get_members_by_country($country_id);

这涉及到一个视图,在该视图中,我显示了一个国家/地区成员的人类可读信息。我可以使用$this->dbutil->csv_from_result($membercountries_query) 在视图或控制器中轻松生成此结果的 CSV,并将其显示在视图中。然后我想向用户展示一个按钮/超链接“将结果下载为 CSV”,这将生成一个文件保存对话框。

我在 SO 上进行了相当多的谷歌搜索和搜索,并且有许多可能的解决方案具有不同程度的复杂性。我想也许添加一个控制器功能,(例如member/create_csv($data)),但想不出一种方法可以将CSV $data 从页面链接传递给它(这可能完全是另一个问题)。

有人可以就创建 CSV 下载链接的最简单快捷的方法提供建议吗?出于安全原因,我不希望将 CSV 文件保存到服务器,然后创建指向已保存文件的链接。

如果能够创建一个通用的帮助器/函数,它可以获取任何查询结果并生成可下载的 CSV,这将是特别有用的。

我感谢 CI 人员制作了 dbutil 和下载帮助程序,最简单的方法必须涉及 csv_from_result()force_download(),但我实在想不出这么晚了将两者结合在一个视图中(或其他):(

【问题讨论】:

  • 感谢您的指点。在发布之前,我确实在该线程中看到了几个解决方案,如果我没有遇到任何更简单的问题,我可能会使用它们。如果可以避免的话,我宁愿不必设置大量标头,尤其是因为在未来的浏览器/服务器中,标头设置可能不起作用。

标签: php codeigniter csv export


【解决方案1】:

我已经基于问题“Download csv from codeigniter mysql”中的第三种解决方案添加了一个相当简单的解决方案,即具有模型功能:

function csv($query, $filename = 'CSV_Report.csv')
{
        $this->load->dbutil();
        $this->load->helper('file');
        $this->load->helper('download');
        $delimiter = ",";
        $newline = "\r\n";
        $data = $this->dbutil->csv_from_result($query, $delimiter, $newline);
        force_download($filename, $data);
}

在生成查询的控制器中,添加 $csv 布尔参数,例如:

function membercountry($country_id = NULL, $csv = false)

并且在控制器函数中有一个条件,如果 $csv 为真或 1,它将调用模型函数:

    if ($csv)
    {
        $date = date('dmy');
        $csvfile = "membercountry" . $date . ".csv";
        $this -> Queries_model -> csv($data['membercountries_query'], $csvfile);
    }

然后在查询结果视图中,在浏览器中以人类可读的形式显示结果后,呈现一个超链接:

<a href="queries/membercountry/<?=$country_id?>/1">Download result as CSV</a>

单击时,它会重新调用控制器,将 $csv 设为 true,然后调用模型函数 csv()。

对于我的应用程序来说,这是一个相当通用的解决方案,它只需要在控制器函数中添加几行额外的代码,并且可以节省将 CSV 文件写入服务器或拥有具有详细和复杂标题的特定视图。这不是 解决方案,只是一个相当简单的快速而肮脏的解决方案,这里的 CI 开发人员可能会觉得有用。再次非常感谢 CI 社区创建了dbutils class,这使得输出 CSV 变得轻而易举。

编辑:从 MVC 的角度来看,将 csv() 函数放在控制器而不是模型中可能会更整洁,并通过 $this -> csv() 调用它。

【讨论】:

  • 注意:这很好用,但提醒一下查询本身必须在 Active Record 类方法中完成(而不是直接查询)。好吧,至少我在第 3 版中必须这样做
【解决方案2】:

模型中的块引用

$this->load->dbutil();
$q=$this->db->query("select * from student order by idate desc");
$delimiter = ",";
$newline = "\r\n";
return $this->dbutil->csv_from_result($q,$delimiter,$newline);

在控制器中

$this->load->helper('download');
$this->load->model('mdl');
$row  = $this->mdl->getall();
$name = 'mycsv.csv';
force_download($name,$row);

【讨论】:

    【解决方案3】:

    你只需要为codeigniter下载csv帮助文件并像它一样运行你的脚本

     $this->db->select('*')->from('*'); 
     $query = $this->db->get('your_table');
    $this->load->helper('csv');
    query_to_csv($query, TRUE, 'filename.csv');
    

    【讨论】:

    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多