phpExcel的整合与使用,遇到的问题

两种方式将 phpexcel 整合到thinkPHP框架中


一:导入phpexcel
/ThinkPHP/Library/Vendor/PHPExcel

调用方法

    Vendor('PHPExcel.PHPExcel');
    $phpexcel = new PHPExcel();

二:导入phpexcel
//Common/org/PHPExcel

调用方法


  
  
  1.        //导入PHPExcel类库         
  2.  import("Common.Org.PHPExcel");  
  3. $phpexcel = new \PHPExcel();//因为路径问题,前面加\

语法使用


  public function out(){    
        //读取库里所有的表            
        $sql="show tables";   
        $result=M()->query($sql);  
        foreach ($result as $k=>$v) {             
            $k++;                     
            $_sql="SHOW FULL COLUMNS FROM ".$v['tables_in_'.C('DB_NAME')]; 
            $data[][0]=array("表 {$k}.".$v['tables_in_'.C('DB_NAME')]."表",'','','','','','');
            $data[][1]=array("字段","类型","校对","NULL","键","默认","额外","权限","注释");
            $data[]=M()->query($_sql);  

            $data[][]=array();                      
        }          
        //导入PHPExcel类库         
        import("Common.Org.PHPExcel");        
        import("Common.Org.PHPExcel.Writer.Excel5");         
        import("Common.Org.PHPExcel.IOFactory.php");         
        $filename="test_excel";              
        $this->getExcel($filename,$data);    
    }  

    private function getExcel($fileName,$data){             
    //对数据进行检验            
         if(empty($data)||!is_array($data)){                 
             die("data must be a array");             
         }             
        $date=date("Y_m_d",time()); 
        $fileName.="_{$date}.xls";              
        //创建PHPExcel对象,注意,不能少了\             
        $objPHPExcel=new \PHPExcel();             
        $objProps=$objPHPExcel->getProperties();  

        $column=2;             
        $objActSheet=$objPHPExcel->getActiveSheet();   
        $objPHPExcel->getActiveSheet()->getStyle()->getFont()->setName('微软雅黑');//设置字体
        $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(25);//设置默认高度

        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth('5');//设置列宽
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth('22');//设置列宽
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth('22');//设置列宽
        $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth('40');//设置列宽

        //设置边框
        $sharedStyle1=new \PHPExcel_Style();
        $sharedStyle1->applyFromArray(array('borders'=>array('allborders'=>array('style'=>\PHPExcel_Style_Border::BORDER_THIN))));
        
        foreach ($data as $ke=>$row){      

            foreach($row as $key=>$rows){

                if(count($row)==1&&empty($row[0][1])&&empty($rows[1])&&!empty($rows)){

                    $objPHPExcel->getActiveSheet()->setSharedStyle($sharedStyle1, "A{$column}:J{$column}");//设置边框
                    array_unshift($rows,$rows['0']);
                    $objPHPExcel->getActiveSheet()->mergeCells("A{$column}:J{$column}");//合并单元格
                    $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFont()->setSize(12);//字体
                    $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFont()->setBold(true);//粗体

                    //背景色填充
                    $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
                    $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->getStartColor()->setARGB('FFB8CCE4');

                }else{
                    if(!empty($rows)){
                        array_unshift($rows,$key+1);
                        $objPHPExcel->getActiveSheet()->setSharedStyle($sharedStyle1,"A{$column}:J{$column}");//设置边框
                    } 
                }

                if($rows['1']=='字段'){
                    $rows[0]='ID';
                    //背景色填充
                    $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
                    $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getFill()->getStartColor()->setARGB('FF4F81BD');
                }

                $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
                $objPHPExcel->getActiveSheet()->getStyle("A{$column}:J{$column}")->getAlignment()->setWrapText(true);//换行
                 //行写入                     
                $span = ord("A");                       
                foreach($rows as $keyName=>$value){                    
                    // 列写入                       
                    $j=chr($span);                         
                    $objActSheet->setCellValue($j.$column, $value);                        
                    $span++;                     
                }                     
                $column++;                 
            }             
        } 
        $fileName = iconv("utf-8", "gb2312", $fileName);             
        //设置活动单指数到第一个表,所以Excel打开这是第一个表             
        $objPHPExcel->setActiveSheetIndex(0);             
        header('Content-Type: application/vnd.ms-excel');             
        header("Content-Disposition: attachment;filename=\"$fileName\"");             
        header('Cache-Control: max-age=0');                
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');             
        $objWriter->save('php://output'); //文件通过浏览器下载             
        exit;     
    }





总结一下最近使用phpexcel类导出excel 文件时遇到的问题,主要包括三大类:

1.导出时提示找不到文件怎么办?

2.导出excel时中文出现乱码的问题。

3.导出数据量大时,提示内存超过最大值或者运行时间超时的问题。

先看下phpexcel常用的方法总结(摘录自zeal_blog:http://www.zeali.net/entry/556)

getProperties()->setCreator("Maarten Balliauw")
		 ->setLastModifiedBy("Maarten Balliauw")
		 ->setTitle("Office 2007 XLSX Test Document")
		 ->setSubject("Office 2007 XLSX Test Document")
		 ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
		 ->setKeywords("office 2007 openxml php")
		 ->setCategory("Test result file");


// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Hello')
            ->setCellValue('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');

// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A4', 'Miscellaneous glyphs')
            ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');


// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);


// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;

使用时常见的问题总结:

1.关于提示找不到文件的问题:

原因可能有:缓冲区没有打开或者mb_overlod_func函数没有关闭,

解决这个问题的最好办法是把php.ini中display_errors打开,下载文件,打开后会提示相应错误信息

display_errors=On,

设置后excel中会有错误信息

若为

'break' not in the 'loop' or 'switch' context
错误位置
FILE: /private/var/www/backend/ThinkPHP/Library/Org/Util/PHPExcel/Calculation/Functions.php  LINE: 576

在 phpExcel 的 文件中查看版本信息

这是1.8版本运行在php7上存在的一个Bug,将phpexcel升级至1.8.1就可以了。


若是后者,则需要打开php.ini文件,找到mbsrtring.func_overload=7将其隐掉。

若能正常导出excel但是没有数据,则一般是程序错误(没有取到数据或数据没赋值)

2.导出excel时出现乱码的问题,这个问题网上的答案很多。主要的解决方案有:

  (1).乱码原因:客户使用的中文版Windows系统平台,而Windows平台的文件名编码为  gb2312(gbk),而我们网页编码为了跟进现存潮流 一般都采用utf-8(国际化)编码,这时当我们:header("Content-Disposition: inline; filename=\"" . $filename . ".xls-:special:1:-")时就会出现乱码,假如你的网页编码就是gb2312那就不用考虑编码问题了(否则转码了反而会出现乱码)。

  解决办法:对$filename转码,执行:iconv('utf-8", "gb2312", $filename)。假如你的环境不支持iconv函数可以换别的函数,只要能将$filename的编码转为gbk就行。

(2):输出文件的时候加上相应的头信息:

Header('content-Type:application/vnd.ms-excel;charset=utf-8');

(3).如果以上方法还是出现乱码,则可能是输出缓冲区中有其他多余的内容,在php文件中设置excel内容之间清理一下输出缓冲区吧:<?php ob_clean();?>

以上三步基本可以涵盖到多数excel乱码的问题。

3.导出大数据时提示错误

打开php.ini文件中的display_errors,查看具体错误信息:一般情况下有两类:

(1).runtime 超过了maxium time,这个时候可能的原因是文件中出现了死循环或者大循环。检查源码看是否有死循环。建议不要在循环体中设置excel格式,占据的时间超多。经初步测试,在循环体中设置3-4个格式,则大约1500条数据时就会出现运行超时的问题。因此尽量把设置格式的代码放置到循环体外。如果还有问题,则有两种方法:修改ini文件,把time_limit=0;远程不能修改ini文件则需要在程序中添加set_time_limit(0);

(2).memory size of ....bytes exhausted这是典型的内存不够用的情况。如可以修改php.ini文件则找到memory_limit = 32M将其改为memory_limit = 64M或者更大128M.如是远程不能修改php.ini文件,则需要在代码中修改:@ini_set('memory_limit','128M');


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值