tp5.1 导出excel 使用插件 为 phpoffice/phpexcel

tp5.1 导出excel 使用插件 为 phpoffice/phpexcel

注意事项:

  1. 不能使用ajax 请求该数据 必须使用a链接直接点击的方式请求
    ajax是无法直接导出excel的,因为ajax的返回值只能是字符流,而导出excel是后台往浏览器中写入二进制的字节流

composer.json 中写的 phpexcel 版本.

"phpoffice/phpexcel": "1.8.*"//

前台代码
 <button type="button" style="margin-left: 16px" class="btn btn-rounded btn-3d btn-light" onclick="exported()">导出</button>
	
	<script>
		function exported(){
			title = $("#title").val();
			type = $("#type").val();
			industry = $("#industry").val();
			window.location = "/firm/firmgy/exp.html?title="+title+"&type="+type+"&industry="+industry;

		}
	</script>
后台代码
use think\facade\Request;
use think\facade\Session;
 /*导出数据*/
    public function exp(){
        if(!(Session::get('USER_INFO_SESSION'))){
            return $this->redirect(url('/login'));
        }
		$list =Db::table('yongjun_firmgy')->selectOrFail();
		$xlsName = "优质企业"; // 文件名
		$xlsCell = [        // 列名
		['id', '序号'],
		['firmname', '标题'],
		['optdt', '添加时间']
		];// 表头信息
        $this->downloadExcel($xlsName,$xlsCell,$list);
    }
    protected function downloadExcel($expTitle, $expCellName, $expTableData)
    {
        $xlsTitle    = iconv('utf-8', 'gb2312', $expTitle);//文件名称
        $fileName    = $expTitle;
        $cellNum     = count($expCellName);// 单元格长度
        $dataNum     = count($expTableData);
        $objPHPExcel = new \PHPExcel();// 引入库
        $cellName = [
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
        ];
        $objPHPExcel->getActiveSheet(0)
            ->mergeCells('A1:' . $cellName[$cellNum - 1] . '1');//合并单元格为表头
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle);// 设置表头单元格
        for ($i = 0; $i < $cellNum; $i++) {
            $objPHPExcel->setActiveSheetIndex(0)
                ->setCellValue($cellName[$i] . '2', $expCellName[$i][1]);

        // 设置列
        }
        // Miscellaneous glyphs, UTF-8  循环写入数据
        for ($i = 0; $i < $dataNum; $i++) {
            for ($j = 0; $j < $cellNum; $j++) {
                $objPHPExcel->getActiveSheet(0)
                    ->setCellValue($cellName[$j] . ($i + 3), $expTableData[$i][$expCellName[$j][0]]);
            }
        }
        ob_end_clean();//这一步非常关键,用来清除缓冲区防止导出的excel乱码
        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . $xlsTitle . '.xls"');
        header("Content-Disposition:attachment;filename=$fileName.xls");//"xls"参考下一条备注
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        //"Excel2007"生成2007版本的xlsx,"Excel5"生成2003版本的xls 调用工厂类
        return $objWriter->save('php://output');
    }
posted @ 2021-12-23 10:41  IUser  阅读(247)  评论(0)    收藏  举报