使用phpExcel類導出excel文件相關問題總結

使用phpExcel類導出excel文件相關問題總結

總結一下最近使用phpexcel類導出excel 文件時遇到的問題,主要包括三大類:

  1.導出時提示找不到文件怎麼辦?

  2.導出excel時中文出現亂碼的問題。

  3.導出數據量大時,提示內存超過最大值或者運行時間超時的問題。

先看下phpexcel常用的方法總結(摘錄自zeal_blog:http://www.zeali.net/entry/556

<?   

/**  

 * 如果使用 Excel5 ,輸出的內容應該是GBK編碼。 

 */  

require_once 'PHPExcel.php';   

//require_once 'PHPExcel/Writer/Excel5.php';    // 用於其他低版本xls  

//require_once 'PHPExcel/Writer/Excel2007.php'; // 用於 excel-2007 格式  

$table = new PHPExcel();  

//設置當前的sheet索引,用於後續的內容操作。  

//一般只有在使用多個sheet的時候才需要顯示調用。  

//缺省情況下,PHPExcel會自動創建第一個sheet被設置SheetIndex=0  

$table->setActiveSheetIndex(0);  

//設置當前活動sheet的名稱  

$table->setActiveSheetIndex(0)->setTitle('test_title');  

$ohjActSheet=$table->setActiveSheetIndex(0);  

//設置單元格內容  

//PHPExcel根據傳入內容自動判斷單元格內容類型  

$objActSheet->setCellValue('A1', '字符串內容');  // 字符串內容  

$objActSheet->setCellValue('A2', 26);            // 數值  

$objActSheet->setCellValue('A3', true);          // 布爾值  

$objActSheet->setCellValue('A4', '=SUM(A2:A2)'); // 公式  

//顯式指定內容類型  

$objActSheet->setCellValueExplicit('A5', '847475847857487584',   

 PHPExcel_Cell_DataType::TYPE_STRING);  

//合併單元格  

$objActSheet->mergeCells('B1:C22');  

//分離單元格  

$objActSheet->unmergeCells('B1:C22');  

//設置單元格樣式  

$objActSheet->getColumnDimension('B')->setAutoSize(true);  

$objActSheet->getColumnDimension('A')->setWidth(30);  

$objStyleA5 = $objActSheet->getStyle('A5');

//設置字體  

$objFontA5 = $objStyleA5->getFont();  

$objFontA5->setName('Courier New');  

$objFontA5->setSize(10);  

$objFontA5->setBold(true);  

$objFontA5->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);  

$objFontA5->getColor()->setARGB('FF999999');    

//設置對齊方式  

$objAlignA5 = $objStyleA5->getAlignment();  

$objAlignA5->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); //水平 

$objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);  //垂直

//設置邊框  

$objBorderA5 = $objStyleA5->getBorders();  

$objBorderA5->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  

$objBorderA5->getTop()->getColor()->setARGB('FFFF0000'); // color  

$objBorderA5->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  

$objBorderA5->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  

$objBorderA5->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  

 

//添加一個新的worksheet  

$table->createSheet();  

$table->getSheet(1)->setTitle('測試2');  

//保護單元格  

$table->getSheet(1)->getProtection()->setSheet(true);  

$table->getSheet(1)->protectCells('A1:C22', 'PHPExcel');  

//$objWriter->save($outputFileName);  

//header("Content-Type: application/octet-stream");  

//header('Content-Disposition:inline;filename="'.$outputFileName.'"');  

//header("Cache-Control: must-revalidate, post-check=0, pre-check=0");  

//header("Pragma: no-cache");  

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

?> 

使用時常見的問題總結:

1.關於提示找不到文件的問題:

原因可能有:緩衝區沒有打開或者mb_overlod_func函數沒有關閉,解決這個問題的最好辦法是把php.inidisplay_errors打開,下載文件,打開後會提示相應錯誤信息。若是後者,則需要打開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');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章