2011年6月16日 星期四

PHPExcel寫入EXCEL出現memory不足解法

    PHPExcel   版本   1.7.2  記憶體

memory_get_usage(true)  取得記憶體現在使用狀況

strlen(serialize($OBJNAME))   取的指定檔案的長度 (通常用來間接表達大小)

在PHPExcel最被詬病的為當匯出檔案過大時,會因為PHPExcel使用一堆迴圈
而占用許多記憶體,造成記憶體不足。
以自己使用經驗來說,100rows 配上 52cols 就會吃掉4mb多的記憶體
所以一次大概跑2000rows 就會吃掉快100mb,
以PHP預設值最大128MB來說  很快就會被吃光。

目前在1.7.6 自己的解決方法是 
先將檔案存至EXCEL

 // Export to Excel2007 (.xlsx) 匯出成2007
   $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
   $objWriter->save('test.xlsx');

 // Export to Excel5 (.xls) 匯出成2003
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('test.xls');


//再清空吃掉的記憶體
$objPHPExcel->disconnectWorksheets();   //此函數可參考底下
//($objPHPExcel 為一開始new PHPExcel() 的object   )

//就可以一直RUN了~


//附上PHPExcel.php    的   __construct()  與  disconnectWorksheets()

public function __construct()
    {
        // Initialise worksheet collection and add one worksheet
        $this->_workSheetCollection = array();
        $this->_workSheetCollection[] = new PHPExcel_Worksheet($this);
        $this->_activeSheetIndex = 0;

        // Create document properties
        $this->_properties = new PHPExcel_DocumentProperties();

        // Create document security
        $this->_security = new PHPExcel_DocumentSecurity();

        // Set named ranges
        $this->_namedRanges = array();

        // Create the cellXf supervisor
        $this->_cellXfSupervisor = new PHPExcel_Style(true);
        $this->_cellXfSupervisor->bindParent($this);

        // Create the default style
        $this->addCellXf(new PHPExcel_Style);
        $this->addCellStyleXf(new PHPExcel_Style);
    }


    public function disconnectWorksheets() {
        foreach($this->_workSheetCollection as $k => &$worksheet) {
            $worksheet->disconnectCells();
            $this->_workSheetCollection[$k] = null;
        }
        unset($worksheet);
        $this->_workSheetCollection = array();
    }

沒有留言:

張貼留言