* @date 2016-05-12 09:50 */ class Csv { /** * 输出对象 * @var string */ protected $output; /** * 输出行数 * @var int */ protected $_row_nums = 0; /** * 构造函数 * @param string $downname 下载的文件名 * @param string $filename 输出文件流名 */ public function __construct($downname = 'export.csv', $filename = 'php://output') { if ($filename === 'php://output') { header("Content-type:text/csv"); header("Content-Disposition:attachment;filename=" . $downname); header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); header('Expires:0'); header('Pragma:public'); } $this->output = fopen($filename, 'w'); } /** * 增加数据列 * @param array $data */ public function add_list($data) { foreach ($data as $row) { is_array($row) && $this->add_row($row); } } /** * 增加一行记录 * @param array $row * @return Csv */ public function add_row($row) { $this->_row_nums++; if ($this->_row_nums % 1000 === 0) { ob_flush(); flush(); } fputcsv($this->output, $this->_convert_gbk($row)); return $this; } /** * 整行数据转为GBK编码 * @param string $row * @return string */ protected function _convert_gbk($row) { foreach ($row as &$value) { $value = mb_convert_encoding($value, 'gbk', 'utf-8'); } return $row; } /** * 关闭输出对象 */ public function close() { !empty($this->output) && fclose($this->output); $this->output = null; } /** * 魔术方法,销毁对象 */ public function __destruct() { $this->close(); } }