从 Codeigniter 导出 CSV 文件

Posted

技术标签:

【中文标题】从 Codeigniter 导出 CSV 文件【英文标题】:Export CSV file from Codeigniter 【发布时间】:2015-02-04 00:29:35 【问题描述】:

我在帮助程序中使用 csv_helper.php 文件进行导出。它正在从 mysql 获取结果,但仅显示结果而不是下载! 这是 csv_helper

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('array_to_csv'))

    function array_to_csv($array, $download = "")
    
        if ($download != "")
           
            header('Content-Type: application/csv');
            header('Content-Disposition: attachment; filename="' . $download . '"');
               
        ob_start();
        $f = fopen('php://output', 'w') or show_error("Can't open php://output");
        $n = 0;     
        foreach ($array as $line)
        
            $n++;
            if ( ! fputcsv($f, $line))
            
                show_error("Can't write line $n: $line");
            
        
        fclose($f) or show_error("Can't close php://output");
        $str = ob_get_contents();
        ob_end_clean();

        if ($download == "")
        
            return $str;    
        
        else
           
            echo $str;
               
    


if ( ! function_exists('query_to_csv'))

    function query_to_csv($query, $headers = TRUE, $download = "")
    
        if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
        
            show_error('invalid query');
        

        $array = array();

        if ($headers)
        
            $line = array();
            foreach ($query->list_fields() as $name)
            
                $line[] = $name;
            
            $array[] = $line;
        

        foreach ($query->result_array() as $row)
        
            $line = array();
            foreach ($row as $item)
            
                $line[] = $item;
            
            $array[] = $line;
        

        echo array_to_csv($array, $download);
    

这是控制器功能:

public function exportUser() 
    $this->load->database();
    $query = $this->db->get('user');
    $this->load->helper('csv');
    query_to_csv($query, TRUE, 'toto.csv');

并在视图页面中显示结果: user_id,user_name,user_email,user_pass,user_phone,user_country,user_city,user_zip,user_address,user_type,user_status 53,abcdef,abcd@yahoo.com,12,1,,0,,,Student,1 54,aws,abc@yahoo .com,12,12,Afghanistan,Kapisa,,,"资源人",0 55,onti,ontika@ya.com,12,12,,0,,,"注册用户",1 56,edf,df@ abc.com,12,12,Albania,Bulqize,,dewde,"管理员用户",1 58,meena,meena@abc.com,,,,,,,"注册用户",0 61,nisat,nisat@abc.com,,,,,,,"注册用户",0

但不下载! Chrome 和 Mozilla 都试过了....

怎么办???

提前谢谢你!

【问题讨论】:

我认为应该是Content-Disposition: attachment,而不是attachement 已编辑...但还是一样的情况:( 您能否验证标题设置是否正确?大多数浏览器中的“网络”检查器会显示请求和响应标头。 试过这个:header('Content-Type: text/csv; charset=utf-8');但没有运气! 【参考方案1】:

尝试修改 array_to_csv() 函数中的标题:

// Disable caching
$time = gmdate('D, d M Y H:i:s');
header('Expires: Tue, 03 Jul 2001 06:00:00 GMT');
header('Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate');
header('Last-Modified: ' . $time . ' GMT');

// Force download
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream');
header('Content-Type: application/download');

// Set encoding
header('Content-Disposition: attachment;filename=' . $download);
header('Content-Transfer-Encoding: binary');

然后在输出部分之后,添加一个出口:

if ($download == "")

    return $str;    

else
   
    echo $str;

exit;

或者尝试使用 CodeIgniter 的内置函数:

public function exportUser() 
    // Load database and query
    $this->load->database();
    $query = $this->db->get('user');

    // Load database utility class
    $this->load->dbutil();
    // Create CSV output
    $data = $this->dbutil->csv_from_result($query);

    // Load download helper
    $this->load->helper('download');
    // Stream download
    force_download('toto.csv', $data);

谢谢,

安德鲁

【讨论】:

我已经修改了我的答案以包含一个用于修改 csv_helper 文件的选项。 我改变了 csv_helper.php 相同的情况!! 我已编辑添加退出。如果这仍然不起作用,请尝试打开显示错误以确保没有任何内容干扰标题。即使是 PHP 警告/通知也可能导致问题。 index.php 显示错误但没有错误! 我也尝试过使用普通文本文件。似乎任何类型的文件都没有下载!有什么可以启用或禁用的吗?请帮忙!

以上是关于从 Codeigniter 导出 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter - 使用日期格式将表记录导出为 CSV

创建 CSV 并合并 2 行并将值设置为 codeigniter 中的标题

Codeigniter 将部分 CSV 数据插入到 MYSQL 中,只有 id 和 date

从 mysql 数据库查询中使用 php 时加快 csv 导出

PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV

使用 csv_from_result 在 CSV 导出中返回字符串而不是数据库条目