phpexcel导出excel无法打开,提示文件格式或文件名无效,文件损毁,解决办法

本人使用过很多次phpexcel了,有时需要保存文件到磁盘,有时需要浏览器弹出下载。保存到磁盘一半不会出现问题,关键是浏览器弹出保存,经常会发生导出的excel文件无法打开,提示文件格式或文件名无效,文件损毁。在此,记录一下解决办法。


1、xls还是xlsx?首先确定导出的excel文件扩展名


2、添加header,不同的文件类型,不同的header。

我就是这里出了问题,xlsx用了xls的header,导致导出的excel无法打开。


2007excel:xlsx如下:

$excelName = '绩效得分统计'.time();

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

header('Content-Disposition: attachment;filename="'.$excelName.'.xlsx"');

header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

$objWriter->save('php://output');

exit;


2003excel:xls如下:

header('Content-Type: application/vnd.ms-excel');

header('Content-Disposition: attachment;filename="links_out'.$timestamp.'.xls"');

header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

$objWriter->save('php://output');

exit;

3、末尾添加exit。

$objWriter->save('php://output');

exit;

例如xlsx,完整参考如下:

//导出订单
public function exportOrders(){
        $phpexcelSrc=APP_PATH.'../PHPExcel/PHPExcel.php';//我们将手动下载的phpexcel放置到了application同级目录
        include ($phpexcelSrc);//引入phpExcel
        $phpexcel=new \PHPExcel();//实例化PHPExcel类对象,方便操作即将生成的excel表格
        $phpexcel->setActiveSheetIndex(0);//选中我们生成的excel文件的第一张工作表
        $sheet=$phpexcel->getActiveSheet();//获取到选中的工作表,方面后面数据插入操作


        //未支付//已支付//未发货//已发货//已收货
    $getData=input('get.');

    if(isset($getData['status'])){
        $status =$getData['status'];
        // dump($getData);die;
        $where = array();
        if($getData['status'] == 'no_paied'){
            $where['o.order_status'] = ['=',0];
        }elseif($getData['status'] == 'paied'){
            $where['o.order_status'] = ['=',1];
        }elseif($getData['status'] == 'no_post'){
            $where['o.order_status'] = ['=',2];
        }elseif($getData['status'] == 'posted'){
            $where['o.order_status'] = ['=',3];
        }elseif($getData['status'] == 'got_goods'){
            $where['o.order_status'] = ['=',4];
        }elseif($getData['status'] == 'got_goods'){
            $where['o.order_status'] = ['>',-1];
        }
    }

    if(!$where){
            $where = 1;
    }

    //过滤,传递当前的参数['query'=>request()->param()]
     $orderRes = db('order')
         ->alias('o')
         ->join('user u','o.uid = u.id')
         ->field('o.*,u.nick_name')
         ->order('o.id desc')
         ->where($where)
         ->select();
     //此处设置的是生成的excel表的第一行标题
     $arr=[
            'id'=>'订单id',
            'out_trade_no'=>'订单编号',
            'goods_total_price'=>'商品总额',
            'order_status'=>'货物状态',
            'shu_name'=>'收货人',
            'phone'=>'手机号',
            'order_time'=>'下单时间',
            'nick_name'=>'用户名',

        ];

        array_unshift($orderRes, $arr);//将我们上面手动设置的标题信息放到数组中,作为第一行写入数据表
        $currow=0;//因为我们生成的excel表格的行数是从1开始,所以我们预先设置好一个变量,供下面foreach循环的$k使用
        foreach ($orderRes as $k => $v) {
            $currow=$k+1;//表示从生成的excel表格的第一行开始插入数据


            //输出样式转换
            if($v['order_status'] == 0){
                $v['order_status'] = '未支付';
            }elseif($v['order_status'] == 1){
                $v['order_status'] = '待发货';
            }elseif($v['order_status'] == 2){
                $v['order_status'] = '待收货';
            }elseif($v['order_status'] == 3){
                $v['order_status'] = '已完成';
            }elseif($v['order_status'] == 4){
                $v['order_status'] = '已取消';
            }else{
                $v['order_status'] = '已删除';
            }


            //时间格式输出
            if($k){
                $v['order_time'] = date("Y-m-d H:i:s",$v['order_time']);
            }


            $sheet->setCellValue('A'.$currow,$v['id'])//为A列循环插入订单id
                  ->setCellValue('B'.$currow,$v['out_trade_no'])//为B列循环插入订单编号
                  ->setCellValue('C'.$currow,$v['goods_total_price'])//为C列循环插入商品总额
                  ->setCellValue('D'.$currow,$v['order_status'])//为D列循环插入支付状态
                  ->setCellValue('E'.$currow,$v['shu_name'])//为E列循环插入收货人
                  ->setCellValue('F'.$currow,$v['phone'])//为F列循环插入手机号
                  ->setCellValue('G'.$currow,$v['order_time'])//为G列循环插入下单时间
                  ->setCellValue('H'.$currow,$v['nick_name'])//为H列循环插入用户名
            ;
        }
//非常重要
        ob_end_clean();//解决excel无法打开问题的函数

        header('Content-Type: application/vnd.ms-excel');//设置下载前的头信息
        header('Content-Disposition: attachment;filename="商品订单1.xlsx"');
        header('Cache-Control: max-age=0');
        $phpwriter=new \PHPExcel_Writer_Excel2007($phpexcel);//此处的2007代表的是高版本的excel表格
        $phpwriter->save('php://output');//生成并下载excel表格
}

//非常重要
        ob_end_clean();//解决excel无法打开问题的函数

        header('Content-Type: application/vnd.ms-excel');//设置下载前的头信息
        header('Content-Disposition: attachment;filename="商品订单1.xlsx"');
        header('Cache-Control: max-age=0');
        $phpwriter=new \PHPExcel_Writer_Excel2007($phpexcel);//此处的2007代表的是高版本的excel表格
        $phpwriter->save('php://output');//生成并下载excel表格

 借鉴:phpexcel生成excel并下载 - Chrdai - 博客园 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xingxingwuxin

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值