php导出EXCEL方法

时间:2022-11-07 14:11:20

// 将数据表导出成 csv 格式文件并下载
// @param string $data:要导出的数据
// @param array $del:不导出的字段名,指定的字段数据不被导出
// @param string $head:表头字段名,以逗号隔开,将在导出的 CSV 文件第一行显示
// @param string $save:下载时保存的文件名前缀,不含后缀,系统会在前缀后加上下载日期和文件扩展名,如定义:questions,保存时的文件名为:questions_20140108.csv
// @param string $coding:保存的字符编码,目标字符编码
// @return bool
public function data2csv($data = array(),$del = array(),$head = '',$save = '',$coding = 'gbk'){
  $tmpfile = SlightPHP::$appDir.'/tmp/data2excel_'.time().mt_rand().'.csv'; // 生成导出的CSV文件,临时保存路径,随机字串,防止被下载
  @setlocale(LC_ALL,'zh_CN');
  if($fp = @fopen($tmpfile,'w')){
    @fputcsv($fp,explode(',',iconv('utf-8',$coding,$head)));
    foreach ($data as $n) {
      foreach((array) $del as $d){ // 删除不导出的字段
        unset($n[$d]);
      }
      foreach($n as &$p){ // 编码转换
        $p = iconv('utf-8',$coding,$p);
      }
      @fputcsv($fp,$n);
    }
    @fclose($fp);
    ob_end_clean();
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    @header('Content-Length: '.filesize($tmpfile));
    header('Content-Disposition: attachment; filename='.$save.'_'.date('Y_m_d_H_i_s').'.csv');
    @readfile($tmpfile);
    @unlink($tmpfile);
    die(); // 必须结束
  } else {
    return false; // 写入文件失败
  }
}