1

我在 CodeIgniter 中使用 PhpExcel。当我在 Excel 中生成大量数据时,会产生致命错误:

Out of memory (allocated 883949568) (tried to allocate 93 bytes) in /home/abc/public_html/xxx/application/libraries/excel/PHPExcel/Style.php on line 465.

即使我在控制器中设置了内存限制 ini_set("memory_limit","5120M");

如何修复该错误?

4

1 回答 1

0

我在控制器中编写了以下代码:

公共函数 export_to_excel($sheets,$num_cols,$tab,$declared_file_name,$download_option) {

          $this->load->library('excel/PHPExcel/iofactory');

    // Cell caching to reduce memory usage.
    $cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
    $cacheSettings = array( ' memoryCacheSize ' => '5120MB');
    PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
            // Create new PHPExcel object
            $this->load->library('excel/PHPExcel');       

            /************ COLUMNS TO CALCULATE SUB TOTAL *******************/
            $col_heads = explode(",",rtrim($num_cols,","));

             foreach($col_heads as $key => $val)
                {
                 if(($val == 'PRODUCT LIABILITY') || ($val == 'PUBLIC LIABILITY') || ($val == 'GIT'))
                    {
                     unset($col_heads[$key]);
                    }
                }
            /************ COLUMNS WITH CURRENCY FORMAT *******************/
            $numeric_cols = array_merge($col_heads, array("LOSS OF RENT",
                                                            "TURNOVER","PRODUCT LIABILITY","PUBLIC LIABILITY","GIT"));

            /********************** SHEETS STARTS ********************************/
            $active_sheet_index = 0;
            foreach ($sheets as $sheet_name=>$rows)
            {
                if ($active_sheet_index > 0)
                {
                    // Create a new worksheet, after the default sheet
                    $this->phpexcel->createSheet();
                }
                $this->phpexcel->setActiveSheetIndex($active_sheet_index);

                $i=1; // start from 2nd row                    
                $numeric_format_col = array();

                /********************** ROWS STARTS ********************************/
                foreach ($rows as $key=>$val)
                {
                    $index = 65;
                    $a = 65;
                    $prefix_code = 65;
                    $prefix = '';

                /********************** COLS STARTS ********************************/
                    foreach ($val as $values)
                    {
                        // from A to Z
                        if ($index <= $a+25)
                        {
                            $cell = $prefix.chr($index).$i;
                        }
                        else
                        {
                            $previou_prefix = '';
                            $prefix = $previou_prefix.chr($prefix_code);
                            if ($prefix_code < $a+25)
                            {
                                $prefix_code++;
                            }
                            else
                            {
                                $prefix_code = 65;
                            }
                            $index = 65;
                            $cell = $prefix.chr($index).$i;
                        }
                        $col_dimension = $prefix.chr($index); // e.g. A,B,C
                        $this->phpexcel->getActiveSheet()->getColumnDimension($col_dimension)->setAutoSize(true);

                        //echo '<br>'.$cell;
                        /******* STORE COLUMN NUMBER FOR SHOWING SUB TOTAL OF COLUMNS ********/
                        if ($i == 1)
                        {
                            $col_val = str_replace('"','',$values);
                            if (in_array($col_val,$col_heads) || in_array(str_replace(' ','_',$col_val),$col_heads) 
                                || (strpos($col_val,'COMMISSION(') !== false && strpos($col_val,'%)') !== false))
                            {
                                $col_name = str_replace(' ','_',$col_val);
                                $tot[$col_name] = $prefix.chr($index);
                            }
                            if (in_array($col_val,$numeric_cols) || in_array(str_replace(' ','_',$col_val),$numeric_cols) 
                                || (strpos($col_val,'COMMISSION(') !== false && strpos($col_val,'%)') !== false))
                            {
                                $numeric_format_col[] = $prefix.chr($index);
                            }
                            if ($col_val == "FULL ADDRESS")
                            {
                                $business_address_col = $prefix.chr($index);
                            }
                        }                           
                        /***********************************************************/

                        $values = str_replace("\"","",$values);
                        if (isset($business_address_col) && $cell != $business_address_col.$i)
                        {                           
                            $values = str_replace("\n"," ",$values);
                            $values = str_replace("\t"," ",$values);
                            $values = str_replace("\r\t"," ",$values);
                        }                       

                        if($i == 1)
                        {
                            // FOR BROKER ACCOUNTS STATEMENT START
                            if ($tab == 'BROKER NAME' && (!(strpos($values,'BROKER COMMISSION') === false) || $values == 'BROKER FEE' || $values == 'BROKER NET') && $sheet_name != 'DBI')
                            {
                                $values = str_replace('BROKER',$sheet_name,$values);
                            }
                            // FOR BROKER ACCOUNTS STATEMENT END

                            $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_CENTER);
                            //$this->PHPExcel->getActiveSheet()->getRowDimension("$i")->setRowHeight(25);
                            $this->phpexcel->getActiveSheet()->setCellValue($cell, trim($values));
                         }
                         else
                         {                           
                            if (isset($business_address_col) && $cell == $business_address_col.$i)
                            {
                                $val_arr = explode("|",$values);
                                $val_str = implode("\n",$val_arr);
                                $this->phpexcel->getActiveSheet()->setCellValue($cell, $val_str);
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setWrapText(true);
                                //$this->phpexcel->getActiveSheet()->getStyle($cell)->getBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
                            }
                            else
                            {
                                $this->phpexcel->getActiveSheet()->setCellValue($cell, trim($values));
                            }

                            if (in_array($col_dimension,$numeric_format_col))
                            {
                                $format ='[$£-809]#,##0.00;[Red]-[$£-809]#,##0.00';   
                                //$format = utf8_encode('[$£-809]#,##0.00;[Red]-[$£-809]#,##0.00');
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getNumberFormat()->setFormatCode($format);
                            }
                         }

                        /******** SET HEADER COLOR ***********/
                        if ($i == 1)
                        {

                            if($this->color1=="#000" && $this->color2=="#000")
                            {
                            if($this->header_alignment=='text-align-left')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_LEFT);
                            }
                            else if($this->header_alignment=='text-align-right')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_RIGHT);                                    
                            }
                            else 
                            {
                            $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_CENTER);
                            }

                            if($this->header_font_style=="bold italic")
                                    {
                                    $header_font_style=explode(" ",$this->header_font_style);
                                    $header_font=array(
                                                        $header_font_style[0] => true,
                                                        $header_font_style[1] => true,
                                                        'color'=> array('argb' => 'FFFFFFFF'),
                                                        'size'=>$this->body_font_size,
                                                        'name'=>$this->body_font

                                          );
                                    }
                                    else 
                                    {
                                    $header_font=array(
                                                        $this->header_font_style => true,
                                                        'color'=> array('argb' => 'FFFFFFFF'),
                                                        'size'=>$this->header_font_size,
                                                        'name'=>$this->header_font,
                                                        'Alignment'=>$this->header_alignment
                                        );
                                    }

                            $this->phpexcel->getActiveSheet()->getStyle($cell)->applyFromArray(
                            array('fill'     => array(
                                                        'type'        => PHPExcel_Style_Fill::FILL_SOLID,
                                                        'color'        => array('argb' => 'FF000000')
                                                    ),
                                'font' => $header_font ,
                                'borders' => array('outline' => array('style' => PHPExcel_Style_Border::BORDER_THICK,

                                                         )
                                                        )
                            )

                            );
                            }
                            else 
                            {
                            if($this->header_alignment=='text-align-left')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_LEFT);
                            }
                            else if($this->header_alignment=='text-align-right')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_RIGHT);                                    
                            }
                            else 
                            {
                            $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_CENTER);
                            }
                        if($this->header_font_style=="bold italic")
                                    {
                                    $header_font_style=explode(" ",$this->header_font_style);
                                    $header_font=array(
                                                        $header_font_style[0] => true,
                                                        $header_font_style[1] => true,
                                                        'color'=> array('rgb' =>$this->color1),
                                                        'size'=>$this->body_font_size,
                                                        'name'=>$this->body_font

                                          );
                                    }
                                    else 
                                    {
                                    $header_font=array(
                                                        $this->header_font_style => true,
                                                        'color'=> array('rgb' =>$this->color1),
                                                        'size'=>$this->header_font_size,
                                                        'name'=>$this->header_font,
                                                        'Alignment'=>$this->header_alignment
                                        );
                                    }
                        $this->phpexcel->getActiveSheet()->getStyle($cell)->applyFromArray(
                            array('fill'     => array(
                                                        'type'        => PHPExcel_Style_Fill::FILL_SOLID,
                                                        'color'        => array('rgb' =>$this->color2)
                                                    ),
                                'font' => $header_font,
                                'borders' => array('outline' => array('style' => PHPExcel_Style_Border::BORDER_THICK,

                                                         )
                                                        )
                            )

                            );

                        }
                        }


                        $index++;
                    }
                    /********************** COLS ENDS ********************************/
                    $final_cell = $cell;
                    $i++;                       
                }
                /********************** ROWS ENDS ********************************/
                 /********************** Body Format********************************/
                 if($this->color3!="#000" || $this->color4!="#000")
                 {
                         if($this->body_alignment=='text-align-left')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_LEFT);
                            }
                            else if($this->body_alignment=='text-align-right')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_RIGHT);                                 
                            }
                            else 
                            {
                            $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_CENTER);
                            }
                            if($this->body_font_style=="bold italic")
                            {

                                $body_font_style=explode(" ",$this->footer_font_style);
                                $body_font=array(
                                                        $body_font_style[0] => true,
                                                        $body_font_style[1] => true,
                                                        'color'=> array('rgb' =>$this->color3),
                                                        'size'=>$this->body_font_size,
                                                        'name'=>$this->body_font
                                          );
                            }
                            else 
                            {
                                $body_font=array(
                                                        $this->body_font_style => true,
                                                        'color'=> array('rgb' =>$this->color3),
                                                        'size'=>$this->body_font_size,
                                                        'name'=>$this->body_font
                                        );
                            }

                            $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->applyFromArray(
                                array(
                                        'fill'     => array(
                                                            'type'        => PHPExcel_Style_Fill::FILL_SOLID,
                                                            'color'        => array('rgb' =>$this->color4)
                                                        ),
                                        'font' => $body_font,
                                        'borders' => array('outline' => array('style' => PHPExcel_Style_Border::BORDER_THICK,))
                                    )                                  
                            );
                      }
                      else 
                      {
                            if($this->body_alignment == 'text-align-left')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_LEFT);
                            }
                            else if($this->body_alignment == 'text-align-right')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_RIGHT);                                 
                            }
                            else 
                            {
                                $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_CENTER);
                            }

                            if ($this->body_font_style == "bold italic")
                            {
                                    $body_font_style = explode(" ",$this->footer_font_style);
                                    $body_font = array(
                                                            $body_font_style[0] => true,
                                                            $body_font_style[1] => true,
                                                            'size'=>$this->body_font_size,
                                                            'name'=>$this->body_font
                                                    );
                            }
                            else 
                            {
                                    $body_font = array(
                                                            $this->body_font_style => true,
                                                            'size'=>$this->body_font_size,
                                                            'name'=>$this->body_font
                                                    );
                            }

                            $this->phpexcel->getActiveSheet()->getStyle("A2:$final_cell")->applyFromArray(
                                array(
                                            'font' => $body_font,
                                            'borders' => array('outline' => array('style' => PHPExcel_Style_Border::BORDER_THICK,) )
                                        )                               
                                );

                        }

                /***************** SHOW SUB TOTAL ROW ************************/                   
                $count_tot = 0;
                if (isset($tot))
                {
                    foreach ($tot as $col_name=>$c)
                    {

                            $count_tot++;
                            $k = $i + 1;
                            $cell = $c.$k;
                            if ($count_tot == 1)
                            {
                                $first_col_name = $cell;
                            }                           
                            $j = $i - 1;               

                            $this->phpexcel->getActiveSheet()->setCellValue($cell, '=SUM('.$c.'2:'.$c.$j.')');

                            $format ='[$£-809]#,##0.00;[Red]-[$£-809]#,##0.00';
                            //$format = utf8_encode('[$£-809]#,##0.00;[Red]-[$£-809]#,##0.00');
                            $this->phpexcel->getActiveSheet()->getStyle($cell)->getNumberFormat()->setFormatCode($format);                           


                    }
                }

                $last_col_name = $cell;                   

                /***************** SET BG COLOR IN SUB TOTAL CELLS ****************/
                if (isset($first_col_name))
                {

                        if($this->color5=="#000" && $this->color6=="#000")
                        {
                            if($this->footer_alignment=='text-align-left')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle("$first_col_name:$last_col_name")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_LEFT);
                            }
                            else if($this->footer_alignment=='text-align-right')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_RIGHT);                                    
                            }
                            else 
                            {
                            $this->phpexcel->getActiveSheet()->getStyle("$first_col_name:$last_col_name")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_CENTER);
                            }

                            if($this->footer_font_style=="bold italic")
                                    {

                                        $footer_font_style=explode(" ",$this->footer_font_style);
                                        $footer_font=array(
                                                        $footer_font_style[0] => true,
                                                        $footer_font_style[1] => true,
                                                        'size'=>$this->footer_font_size,
                                                        'name'=>$this->footer_font
                                          );
                                    }
                                    else 
                                    {
                                        $footer_font=array(
                                                        $this->footer_font_style => true,
                                                        'size'=>$this->footer_font_size,
                                                        'name'=>$this->footer_font
                                                        );
                                    }
                            $this->phpexcel->getActiveSheet()->getStyle("$first_col_name:$last_col_name")->applyFromArray(
                        array('fill'     => array(
                                                    'type'        => PHPExcel_Style_Fill::FILL_SOLID,
                                                    'color'        => array('argb' => 'FFCCFFCC')
                                                ),
                              'font'    =>$footer_font,
                              'borders' => array('outline' => array('style' => PHPExcel_Style_Border::BORDER_THICK,

                                                         )
                                                        )
                             )
                        );
                        }
                        else 
                        {

                            if($this->footer_alignment=='text-align-left')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle("$first_col_name:$last_col_name")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_LEFT);
                            }
                            else if($this->footer_alignment=='text-align-right')
                            {
                                $this->phpexcel->getActiveSheet()->getStyle($cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_RIGHT);                                    
                            }
                            else 
                            {
                            $this->phpexcel->getActiveSheet()->getStyle("$first_col_name:$last_col_name")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment :: HORIZONTAL_CENTER);
                            }
                            if($this->footer_font_style=="bold italic")
                            {

                                $footer_font_style=explode(" ",$this->footer_font_style);
                                $footer_font=array(
                                                        $footer_font_style[0] => true,
                                                        $footer_font_style[1] => true,
                                                        'color'=> array('rgb' =>$this->color5),
                                                        'size'=>$this->footer_font_size,
                                                        'name'=>$this->footer_font
                                          );
                            }
                            else 
                            {
                                $footer_font=array(
                                                        $this->footer_font_style => true,
                                                        'color'=> array('rgb' =>$this->color5),
                                                        'size'=>$this->footer_font_size,
                                                        'name'=>$this->footer_font
                                                        );
                            }


                    $this->phpexcel->getActiveSheet()->getStyle("$first_col_name:$last_col_name")->applyFromArray(
                    array('fill'     => array(
                                                        'type'        => PHPExcel_Style_Fill::FILL_SOLID,
                                                        'color'        => array('rgb' =>$this->color6)
                                                    ),
                                'font' =>$footer_font,
                                'borders' => array('outline' => array('style' => PHPExcel_Style_Border::BORDER_THICK,

                                                         )
                                                        )
                            )
                        );
                }
                }

                $this->phpexcel->getActiveSheet()->getStyle("A1:$final_cell")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_TOP);

                // Rename sheet
                $this->phpexcel->getActiveSheet()->setTitle($sheet_name);
                $active_sheet_index++;                   
            }

           // $this->phpexcel->getActiveSheet()->setAutoFilter('A1:C9');
            /********************** SHEETS ENDS ********************************/
            $file_name = $declared_file_name.'.xls';
            if ($download_option == 'declare_report' || $download_option == 'save_report')
            {


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

                $objWriter = PHPExcel_IOFactory::createWriter($this->phpexcel, 'Excel5');
                $objWriter->save('php://output'); 
                if ($download_option == 'declare_report')
                {
                $objWriter->save('uploads/declared_reports/'.$file_name);
                }
                else{
                $objWriter->save('uploads/saved_reports/'.$file_name);
                }
                //echo __FILE__;
                //$objWriter->save(str_replace(__FILE__,'uploads/declared_reports/'.$file_name,__FILE__));            

            }
            else
            {
                // Redirect output to a client’s web browser (Excel2007)
                header('Content-Type: application/vnd.ms-excel');
                header('Content-Disposition: attachment;filename="'.$file_name.'"');
                header('Cache-Control: max-age=0');

                $objWriter = PHPExcel_IOFactory::createWriter($this->phpexcel, 'Excel5');

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

}
于 2013-01-25T14:13:53.533 回答