从 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 导出