整合ThinkPHP功能系列之生成csv格式的Excel表格

我也要整理下用 ThinkPHP 框架写过的功能了,省得以后找来找去,在商城项目中经常需要将订单等数据导出生成 excel 表格

我先使用了一下 PHPExcel 这个来导出数据,导出来的数据倒是没有问题,主要是没有表头,要的急就没搞这个了,直接通过逗号换行生成 csv 格式的表格文件

实现的原理很简单:就是用逗号作为每个单元格的分解,再用换行作为表格的换行,最后生成 csv 格式的文件就可以了

/**
* 数据转 csv 格式的 excel
* @param array $data 需要转的数组
* @param string $filename 生成的 excel 文件名
*  示例数组:
    $data = array(
      '1,2,3,4,5',
      '6,7,8,9,0',
      '1,3,5,7,9'
    );
*/
function createCsv($data,$filename='orderlist.csv'){
    // 防止没有添加文件后缀
    $filename=str_replace('.csv', '', $filename).'.csv';
    Header( "Content-type: application/octet-stream ");
    Header( "Accept-Ranges: bytes ");
    Header( "Content-Disposition: attachment; filename=".$filename);
    foreach( $data as $k => $v){
      // 替换掉换行
      $v=preg_replace('/\s*/', '', $v);
      // 转成 gbk 以兼容 office 乱码的问题
      echo iconv('UTF-8','GBK',$v)."\r\n";
    }
}

需要导出数据的地方应该还是挺多的,我直接放在Application/Common/Common/function.php中,方便使用

调用的话就直接这样使用就 ok

$data = array(
   '1,2,3,4,5',
   '6,7,8,9,0',
   '1,3,5,7,9'
);
createCsv($data)

但是这样可能并不能满足我们的需求,实际应用中数据一般是从数据库取出的二维数组

/**
* 数据转 csv 格式的 excel
* @param array $data 需要转的数组
* @param string $header   要生成的 excel 表头
* @param string $filename 生成的 excel 文件名
*  示例数组:
    $data = array(
      '1,2,3,4,5',
      '6,7,8,9,0',
      '1,3,5,7,9'
    );
*/
function create_csv($data,$header=null,$filename='orderlist.csv'){
     // 如果手动设置表头;则放在第一行
     if (!is_null($header)) {
         array_unshift($data, $header);
     }
     // 防止没有添加文件后缀
     $filename=str_replace('.csv', '', $filename).'.csv';
     ob_clean();
     Header( "Content-type: application/octet-stream ");
     Header( "Accept-Ranges: bytes ");
     Header( "Content-Disposition: attachment; filename=".$filename);
     foreach( $data as $k => $v){
     // 如果是二维数组;转成一维
     if (is_array($v)) {
         $v=implode(',', $v);
     }
     // 替换掉换行
     $v=preg_replace('/\s*/', '', $v);
     // 解决导出的数字会显示成科学计数法的问题
     $v=str_replace(',', "\t,", $v);
     // 转成 gbk 以兼容 office 乱码的问题
     echo iconv('UTF-8','GBK',$v)."\t\r\n";
     }
}

这样就完成了从数据库导出数据的功能,csv 格式的可以使用 WPS 或者 Office 打开,也可以当 text 用记事本或者文本编辑器都可以直接打开编辑

5 条评论

发表评论

*