用phpExcel類導出excel文件相關問題總結
Autor:霍小慶time:2011-04-22
總結一下最近使用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();
//設置文檔基本屬性
$table = $table->getProperties();
$table->setCreator("username");
$table->setLastModifiedBy("username");
$table->setTitle("document_title");
$table->setSubject("");
$table->setDescription("Test document, generated by PHPExcel.");
$table->setKeywords("office excel PHPExcel");
$table->setCategory("Test");
//設置當前的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);
//設置填充顏色
$objFillA5 = $objStyleA5->getFill();
$objFillA5->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objFillA5->getStartColor()->setARGB('FFEEEEEE');
//從指定的單元格複製樣式信息.
$objActSheet->duplicateStyle($objStyleA5, 'B1:C22');
//添加圖片
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('ZealImg');
$objDrawing->setDescription('Image inserted by Zeal');
$objDrawing->setPath('./zeali.net.logo.gif');
$objDrawing->setHeight(36);
$objDrawing->setCoordinates('C23');
$objDrawing->setOffsetX(10);
$objDrawing->setRotation(15);
$objDrawing->getShadow()->setVisible(true);
$objDrawing->getShadow()->setDirection(36);
$objDrawing->setWorksheet($objActSheet);
//添加一個新的worksheet
$table->createSheet();
$table->getSheet(1)->setTitle('測試2');
//保護單元格
$table->getSheet(1)->getProtection()->setSheet(true);
$table->getSheet(1)->protectCells('A1:C22', 'PHPExcel');
//輸出內容
$outputFileName = "output.xls";
//到文件
//$objWriter->save($outputFileName);
//or
//到瀏覽器
//header("Content-Type: application/octet-stream");
//header('Content-Disposition:inline;filename="'.$outputFileName.'"');
//header("Content-Transfer-Encoding: binary");
//header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
//header("Last-Modified: " . gmdate("D, d MYH:i:s") . " GMT");
//header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
//header("Pragma: no-cache");
//$objWriter->save('php://output');
?>
使用時常見的問題總結:
1.關於提示找不到文件的問題:
原因可能有:緩衝區沒有打開或者mb_overlod_func函數沒有關閉,解決這個問題的最好辦法是把php.ini中display_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條數據時就會出現運行超時的問題。因此盡量把設置格式的代碼放置到循環體外。
(2).memory size of ....bytes exhausted這是典型的內存不夠用的情況。如可以修改php.ini文件則找到memory_limit = 32M將其改為memory_limit = 64M或者更大128M.如是遠程不能修改php.ini文件,則需要在代碼中修改:@ini_set('memory_limit','64M' );
沒有留言:
張貼留言