zoukankan      html  css  js  c++  java
  • PhpSpreadsheet导出excel

    namespace service;
    
    
    use PhpOfficePhpSpreadsheetSpreadsheet;
    use PhpOfficePhpSpreadsheetWriterXlsx;
    
    class ExcelService
    {
        /**
         * @param string $name excel表的表名
         * @param array $data 要导出excel表的数据,接受一个二维数组
         * @param array $head excel表的表头,接受一个一维数组
         * @throws PhpOfficePhpSpreadsheetException
         * @throws PhpOfficePhpSpreadsheetWriterException
         */
        public static function outdata($name = '', $data = [], $head = [],$format = "xlsx")
        {
            set_time_limit(0);
            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
    //        $sheet->setTitle('表名');
            $letter = 'A';
            foreach($head as $values){
                $sheet->setCellValue($letter.'1', $values);
                ++$letter;
            }
            if(is_array($data)){
                foreach($data as $k=>$v){
                    $letter = 'A';
                    $k = $k+2;
                    reset($head);
                    foreach($head as $key=>$value){
                        $testKey = explode('.',$key);
                        if(count($testKey)>1){
                            $val = $v[$testKey[0]][$testKey[1]];
                        }else{
                            $val = $v[$key];
                        }
                        $sheet->setCellValue($letter.$k, $val);
                        ++$letter;
                    }
                }
            }
            ob_end_clean();
            if ($format == 'xls') {
                //输出Excel03版本
                header('Content-Type:application/vnd.ms-excel');
                $class = "PhpOfficePhpSpreadsheetWriterXls";
            } elseif ($format == 'xlsx') {
                //输出07Excel版本
                header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
                $class = "PhpOfficePhpSpreadsheetWriterXlsx";
            }
            //输出名称
            header('Content-Disposition:attachment;filename="'.mb_convert_encoding($name,"GB2312", "utf-8").'.'.$format.'"');
            //禁止缓存
            header('Cache-Control: max-age=0');
            $writer = new $class($spreadsheet);
    //        $writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Xlsx');
    
            $writer->save('php://output');
    
    //        $filePath = env('runtime_path')."temp/".time().microtime(true).".tmp";
    //        $writer->save($filePath);
    //        readfile($filePath);
    //        unlink($filePath);
    
    //        header('Content-Type: application/vnd.ms-excel');
    //        header('Content-Disposition: attachment;filename="' . $name . '.xlsx"');
    //        header('Cache-Control: max-age=0');
    //        $writer = new Xlsx($spreadsheet);
    //        $writer->save('php://output');
    //
    //        //删除清空:
            $spreadsheet->disconnectWorksheets();
            unset($spreadsheet);
            exit;
        }
    }

    使用导出模板进行导出

            $list = [];
            $spreadsheet = IOFactory::load('./tpl/down.xlsx');
            $worksheet = $spreadsheet->getActiveSheet();
            $i = 1;
            foreach ($list as $k=>$vo){
                $worksheet->setCellValueExplicit('A'.$i, $k+1,DataType::TYPE_STRING);
               
                ++$i;
            }
    
            ob_end_clean();
            
            $writer = IOFactory::createWriter($spreadsheet,'Xlsx');
            //输出名称
            header('Content-Disposition:attachment;filename="' . mb_convert_encoding('文件名称', "GB2312", "utf-8") . '.xlsx"');
            //禁止缓存
            header('Cache-Control: max-age=0');
            $writer->save('php://output');
            $spreadsheet->disconnectWorksheets();
            unset($spreadsheet);
            exit;

    说说遇到的问题:

    一开始本地导出完全没问题,然后放到线上服务器,可以导出,但导出的文件死活打不开(xlsx),提示:EXCEL无法打开文件,因为文件格式或文件扩展名无效;导出xls文件打开是乱码

    解决办法,在header()导出前添加 

    ob_end_clean();

    清除缓冲区,避免乱码,重试然后正常导出和打开

  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/benlightning/p/10266245.html
Copyright © 2011-2022 走看看