過去工做中使用
PHPExcel
較多,碰到並解決了各類大大小小的問題,總結出這樣一篇文章,一方面記錄本身踩過的坑,一方面與你們分享,讓你們少走彎路,並不斷完善之,歡迎你們去github
上面star
和提交pull request
,不斷補充和優化,打造最全面的PHPExcel
開發解決方案php
Github 地址:https://github.com/tony-yin/P...
原文地址:https://tony-yin.github.io/20...html
yourpath . /phpexcel/PHPExcel.php
$excel = new PHPExcel();
$objexcel = $excel->getActiveSheet();
$objexcel->mergeCells('A1:M1');
$objexcel->getStyle('A1');
$cellFont = $objexcel->getStyle('A1')->getFont();
$fontStyle->setSize(15);
$fontStyle->setBold(true);
$fontStyle->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
$rowStyle = $objexcel->getStyle(1)->getRowDimension();
$rowStyle->setRowHeight(2);
$columnStyle = $objexcel->getStyle('A')->getColumnDimension();
$columnStyle->setWidth(10);
$alignStyle = $objexcel->getStyle('A')->getAlignment();
$alignStyle>setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$alignStyle->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$$alignStyle->setWrapText(true);
如需更早的版本可將Excel2007
換成Excel5
git
$write = PHPExcel_IOFactory::createWriter("xcel, 'Excel2007');
phpexcel
通常獲取cell
或者獲取列都是經過ABC
這樣的英文字母獲取的,它也能夠經過0、一、二、3
這樣的數字表示sheet中的列,從0
開始,0
對應A
,1
對應B
,基本上大多數方法都是數字行列索引,例如getStyleByColumnAndRow($col,$row)
,默認列參數在前,行參數在後,更多的能夠參加phpexcel
源碼;github
有的時候一個方法須要行列兩個參數,例如只須要某一行參數可寫成
(null, $row)
,例如只須要得到某一列參數可寫成($col, null)
算法
PHPExcel_Cell::columnIndexFromString('A'); // Return 1 not 0;
PHPExcel_Cell::stringFromColumnIndex(0); // Return 'A';
PHPExcel
讀取的cell
數字,類型都是double
型,可用gettyle()
方法檢測類型,當初我一直使用is_int()
方法無果,搞得焦頭爛額。。。瀏覽器
PHPExcel
生成的表格若是你不加處理,是不會幫你生成邊框線的,生成邊框線的方法以下:app
$borderArray = array( 'borders' => array( 'allborders' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN ) ) ); $objexcel->getStyle($col1, $row1,$col2, $row2)->applyFromArray($borderArray);
注:函數
getStyle()
能夠看需求改成getStyleByColumnAndRow()
方法經過數字行列索引讀取style
- array中
PHPExcel_Style_Border::
後面有三種格式分別是BORDER_THIN
和BORDR_MEDIUM
,表示邊框線的粗細;getStyle()
中的索引能夠是靜態的,也能夠是動態的,通常是在導出excel
的數據set
完畢後填寫左上角的單元格行列索引和右下角的單元格行列索引;參考資料性能
http://phpexcel.codeplex.com/...
http://phpexcel.codeplex.com/...字體
$objexcel->getStyle($pCoordinate)->applyFromArray(array( 'font' => array( 'bold' => true, ), ));
$objexcel->getStyle($pCoordinate)->applyFromArray(array( 'font' => array( 'color' => array( 'rgb' => 'ff0000', ), ), ) );
動態爲當前sheet
設置索引,而後獲取當前sheet
,即可循環讀取每個sheet
內容
$objexcel->setActiveSheetIndex($index); //$index = 0 1 2 3 $objexcel->getActiveSheet(); //return sheet1 sheet2 sheet 3
當需求是給定一個一個模板
excel
,須要往裏面塞數據,咱們不必定要經過代碼給它設定樣式,若是這個模板變化不大,咱們徹底能夠存放一個格式相同的靜態文件,而後經過PHPExcel
讀取,再往裏面塞數據,最後進行保存操做,能夠達到同樣的效果,而且能夠節省大量的資源。
在特殊的表格中,合併單元格廣泛存在,而多個單元格合併成的一個單元格,只能
setValue()
一次,而咱們如何判斷合併單元格的具體行列呢?
$range = $start_cell->getMergeRange(); // 經過合併單元格的開始單元格好比‘A1’,獲取合併範圍‘A1:A4’ $cell->isInRange($range); // 遍歷以後每個單元格即可經過isInRange()方法判斷當前單元格是否在合併範圍內
通常excel單元格中數據的格式爲數據類型,而
PHPExcel
中的getValue()
方法讀取的也是數據類型,當把數據從數據類型改成文本類型後,在PHPExcel
中讀出來的是PHPExcel_RichText
類型,getValue()
讀取返回PHPExcel_RichText
是一個object
類型(PHPExcel_RichText
數據保存格式);那如何讀取這一類的數據呢?仔細查看讀取出來的對象,不難發現有getPlainText()
這樣的方法能夠讀取文本類型數據,因此咱們只要判斷噹噹前數據爲文本數據時用getPlainText()
讀取,通常數據用getValue()
讀取
if ($cell->getValue() instanceof PHPExcel_RichText) { $value = $cell->getValue(); } else { $value = $cell->getValue(); }
參考資料
http://www.cnblogs.com/DS-CzY...
http://phpexcel.codeplex.com/...
excel
擁有強大的算法功能,通常算法格式爲=A3+A4
這類的,複雜的更多,若是使用PHPExcel
提供的默認讀取方法getValue()
讀取出來的結果則爲字符串=A3+A4
,好在PHPExcel
也足夠強大,提供了相應的接口:getCalculatedValue()
,這個方法專門讀取算法數據,可是咱們不能將這個方法做爲默認讀取方法,由於這樣可能會將一些原本要讀成字符串的讀成算法數據,並且PHPExcel
沒有將它做爲默認讀取方法的另外一個重要緣由就是算法方式讀取很耗時間和性能,通常數據讀取根本沒有必要這樣浪費資源,因此咱們能夠採用如下這種方式
if (strstr($cell->getValue(), '=')) { // 判斷若是cell內容以=號開頭便默認爲算法數據 $value = $cell->getCalculatedValue(); } else { $value = $cell->getValue(); }
除了以上所說的文本數據和算法數據外,我還遇到過日期類型數據,好比
2016-12-28
輸入到excel
中,它會默認轉換成2016/12/28
,若是採用通常的getValue()
方式讀取也會讀取到錯誤的數據,PHPExcel
也提供了相應的接口getFormattedValue()
,並提供了適配的識別方式PHPExcel_Shared_Date::isDateTime($cell)
,因此代碼就很好實現了
if (PHPExcel_Shared_Date::isDateTime($cell)) { $value = $cell->getFormattedValue(); } else { $value = $cell->getValue(); }
針對
excel
各類數據類型,咱們能夠寫一個函數,將原有的getValue()
封裝一下,這樣之後就不用每次都判別一下數據類型了,目前我只遇到上面三種特殊格式,若是有新的,歡迎你們補充,封裝函數以下
function get_value_of_cell($cell) { if (strstr($cell->getValue(), '=')) { $value = $cell->getCalculatedValue(); } else if ($cell->getValue() instanceof PHPExcel_RichText) { $value = $cell->getValue(); } else if (PHPExcel_Shared_Date::isDateTime($cell)) { $value = $cell->getFormattedValue(); } else { $value = $cell->getValue(); } }
$filename = 'xxx導出表'; // 判斷若是是IE內核形式的瀏覽器採用urlencode處理文件名 if (!preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) { $filename = urlencode($filename); }
未完待續。。。期待你的補充和優化