摘要:過去工作中使用較多,碰到并解決了各種大大小小的問題,總結(jié)出這樣一篇文章,一方面記錄自己踩過的坑,一方面與大家分享,讓大家少走彎路,并不斷完善之,歡迎大家去上面和提交,不斷補充和優(yōu)化,打造最全面的開發(fā)解決方案地址原文地址基礎(chǔ)小試牛刀引用文
過去工作中使用PHPExcel較多,碰到并解決了各種大大小小的問題,總結(jié)出這樣一篇文章,一方面記錄自己踩過的坑,一方面與大家分享,讓大家少走彎路,并不斷完善之,歡迎大家去github上面star和提交pull request,不斷補充和優(yōu)化,打造最全面的PHPExcel開發(fā)解決方案
Github 地址:https://github.com/tony-yin/P...
原文地址:https://tony-yin.github.io/20...
yourpath . /phpexcel/PHPExcel.php2. 實例化phpexcel類
$excel = new PHPExcel();3. 獲取當(dāng)前單sheet(多sheet會在下面講)
$objexcel = $excel->getActiveSheet();4. 合并單元格
$objexcel->mergeCells("A1:M1");5. 獲取一個cell的樣式
$objexcel->getStyle("A1");
獲取一個cell的字體樣式
$cellFont = $objexcel->getStyle("A1")->getFont();
設(shè)置字體大小
$fontStyle->setSize(15);
設(shè)置字體是否加粗
$fontStyle->setBold(true);
設(shè)置字體顏色
$fontStyle->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
獲取一行樣式
$rowStyle = $objexcel->getStyle(1)->getRowDimension();
設(shè)置行高度
$rowStyle->setRowHeight(2);
獲取一列樣式
$columnStyle = $objexcel->getStyle("A")->getColumnDimension();
設(shè)置列寬度
$columnStyle->setWidth(10);
獲取一列對齊樣式
$alignStyle = $objexcel->getStyle("A")->getAlignment();
設(shè)置水平居中:同一水平線上居中,即為左右的中間
$alignStyle>setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
設(shè)置垂直居中:同一垂直線居中,即為上下的中間
$alignStyle->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
自動換行
$$alignStyle->setWrapText(true);6. 獲取指定版本excel寫對象
如需更早的版本可將Excel2007換成Excel5
$write = PHPExcel_IOFactory::createWriter("xcel, "Excel2007");進階:一些有用的小知識 1.行列數(shù)字索引方法
2. 單行或單列參數(shù)格式phpexcel一般獲取cell或者獲取列都是通過ABC這樣的英文字母獲取的,它也可以通過0、1、2、3這樣的數(shù)字表示sheet中的列,從0開始,0對應(yīng)A,1對應(yīng)B,基本上大多數(shù)方法都是數(shù)字行列索引,例如getStyleByColumnAndRow($col,$row),默認列參數(shù)在前,行參數(shù)在后,更多的可以參加phpexcel源碼;
3. 列的數(shù)字索引格式和字母索引格式互轉(zhuǎn)有的時候一個方法需要行列兩個參數(shù),例如只需要某一行參數(shù)可寫成(null, $row),例如只需要獲得某一列參數(shù)可寫成($col, null)
數(shù)字轉(zhuǎn)字符串
PHPExcel_Cell::columnIndexFromString("A"); // Return 1 not 0;
字符串轉(zhuǎn)數(shù)字
PHPExcel_Cell::stringFromColumnIndex(0); // Return "A";4.PHPExcel讀取數(shù)字類型
5. 多cell邊框線設(shè)置PHPExcel讀取的cell數(shù)字,類型都是double型,可用gettyle()方法檢測類型,當(dāng)初我一直使用is_int()方法無果,搞得焦頭爛額。。。
PHPExcel生成的表格如果你不加處理,是不會幫你生成邊框線的,生成邊框線的方法如下:
$borderArray = array( "borders" => array( "allborders" => array( "style" => PHPExcel_Style_Border::BORDER_THIN ) ) ); $objexcel->getStyle($col1, $row1,$col2, $row2)->applyFromArray($borderArray);
6. 多cell字體加粗處理注:
getStyle()可以看需求改為getStyleByColumnAndRow()方法通過數(shù)字行列索引讀取style
array中PHPExcel_Style_Border::后面有三種格式分別是BORDER_THIN和BORDR_MEDIUM,表示邊框線的粗細;
getStyle()中的索引可以是靜態(tài)的,也可以是動態(tài)的,一般是在導(dǎo)出excel的數(shù)據(jù)set完畢后填寫左上角的單元格行列索引和右下角的單元格行列索引;
參考資料
http://phpexcel.codeplex.com/...
http://phpexcel.codeplex.com/...
$objexcel->getStyle($pCoordinate)->applyFromArray(array( "font" => array( "bold" => true, ), ));7. 多cell字體顏色處理
$objexcel->getStyle($pCoordinate)->applyFromArray(array( "font" => array( "color" => array( "rgb" => "ff0000", ), ), ) );8. 多sheet導(dǎo)入
動態(tài)為當(dāng)前sheet設(shè)置索引,然后獲取當(dāng)前sheet,便可循環(huán)讀取每一個sheet內(nèi)容
$objexcel->setActiveSheetIndex($index); //$index = 0 1 2 3 $objexcel->getActiveSheet(); //return sheet1 sheet2 sheet 39. 固定格式excel讀取在寫入
10. 合并單元格導(dǎo)入問題當(dāng)需求是給定一個一個模板excel,需要往里面塞數(shù)據(jù),我們不一定要通過代碼給它設(shè)定樣式,如果這個模板變化不大,我們完全可以存放一個格式相同的靜態(tài)文件,然后通過PHPExcel讀取,再往里面塞數(shù)據(jù),最后進行保存操作,可以達到一樣的效果,并且可以節(jié)省大量的資源。
在特殊的表格中,合并單元格普遍存在,而多個單元格合并成的一個單元格,只能setValue()一次,而我們?nèi)绾闻袛嗪喜卧竦木唧w行列呢?
$range = $start_cell->getMergeRange(); // 通過合并單元格的開始單元格比如‘A1’,獲取合并范圍‘A1:A4’ $cell->isInRange($range); // 遍歷之后每一個單元格便可通過isInRange()方法判斷當(dāng)前單元格是否在合并范圍內(nèi)高級:特殊場景特殊手段 1. 單元格文本格式數(shù)據(jù)處理
一般excel單元格中數(shù)據(jù)的格式為數(shù)據(jù)類型,而PHPExcel中的getValue()方法讀取的也是數(shù)據(jù)類型,當(dāng)把數(shù)據(jù)從數(shù)據(jù)類型改為文本類型后,在PHPExcel中讀出來的是PHPExcel_RichText類型,getValue()讀取返回PHPExcel_RichText是一個object類型(PHPExcel_RichText數(shù)據(jù)保存格式);那如何讀取這一類的數(shù)據(jù)呢?仔細查看讀取出來的對象,不難發(fā)現(xiàn)有getPlainText()這樣的方法可以讀取文本類型數(shù)據(jù),所以我們只要判斷當(dāng)當(dāng)前數(shù)據(jù)為文本數(shù)據(jù)時用getPlainText()讀取,一般數(shù)據(jù)用getValue()讀取
if ($cell->getValue() instanceof PHPExcel_RichText) { $value = $cell->getValue(); } else { $value = $cell->getValue(); }
2. 單元格數(shù)據(jù)算法處理參考資料
http://www.cnblogs.com/DS-CzY...
http://phpexcel.codeplex.com/...
excel擁有強大的算法功能,一般算法格式為=A3+A4這類的,復(fù)雜的更多,如果使用PHPExcel提供的默認讀取方法getValue()讀取出來的結(jié)果則為字符串=A3+A4,好在PHPExcel也足夠強大,提供了相應(yīng)的接口:getCalculatedValue(),這個方法專門讀取算法數(shù)據(jù),但是我們不能將這個方法作為默認讀取方法,因為這樣可能會將一些本來要讀成字符串的讀成算法數(shù)據(jù),而且PHPExcel沒有將它作為默認讀取方法的另一個重要原因就是算法方式讀取很耗時間和性能,一般數(shù)據(jù)讀取根本沒有必要這樣浪費資源,所以我們可以采用以下這種方式
if (strstr($cell->getValue(), "=")) { // 判斷如果cell內(nèi)容以=號開頭便默認為算法數(shù)據(jù) $value = $cell->getCalculatedValue(); } else { $value = $cell->getValue(); }3. 日期數(shù)據(jù)處理
除了以上所說的文本數(shù)據(jù)和算法數(shù)據(jù)外,我還遇到過日期類型數(shù)據(jù),比如2016-12-28輸入到excel中,它會默認轉(zhuǎn)換成2016/12/28,如果采用一般的getValue()方式讀取也會讀取到錯誤的數(shù)據(jù),PHPExcel也提供了相應(yīng)的接口getFormattedValue(),并提供了適配的識別方式PHPExcel_Shared_Date::isDateTime($cell),所以代碼就很好實現(xiàn)了
if (PHPExcel_Shared_Date::isDateTime($cell)) { $value = $cell->getFormattedValue(); } else { $value = $cell->getValue(); }4. 讀取方法封裝
針對excel各種數(shù)據(jù)類型,我們可以寫一個函數(shù),將原有的getValue()封裝一下,這樣以后就不用每次都判別一下數(shù)據(jù)類型了,目前我只遇到上面三種特殊格式,如果有新的,歡迎大家補充,封裝函數(shù)如下
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(); } }5. 導(dǎo)出文件在IE、360等瀏覽器中文件名中文亂碼問題
$filename = "xxx導(dǎo)出表"; // 判斷如果是IE內(nèi)核形式的瀏覽器采用urlencode處理文件名 if (!preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) { $filename = urlencode($filename); }
未完待續(xù)。。。
期待你的補充和優(yōu)化
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25854.html
關(guān)于 PHP 導(dǎo)出 excel csv 常用的有 PHPexcel ,本文整理了一些其他方案。 高性能 Excel 擴展 sudo apt-get install -y zlib1g-dev git clone https://github.com/jmcnamara/libxlsxwriter.git cd libxlsxwriter make && sudo make install // ...
摘要:能不能單獨設(shè)置某個單元格的值這個目前并沒有實現(xiàn),現(xiàn)在數(shù)據(jù)的寫入都是逐行寫入的,不支持這么細的粒度,不過折中的做法是把不需要填充的單元格寫入即可如果有什么使用問題,可以在下面留言,一起探討使用方式 二者有何區(qū)別? PHPExcel 是一個處理Excel,CVS文件的開源框架,它基于微軟的OpenXML標(biāo)準(zhǔn)和PHP語言。可以使用它來讀取、寫入不同格式的電子表格,這也是PHP至今最通用的Ex...
摘要:要求,使用了名字空間編碼規(guī)范最新的語言新特性對版本的要求加強。已經(jīng)放出穩(wěn)定版,官方不再建議使用。保存和導(dǎo)入的行為分別由和負責(zé)。注意不要混淆和對象持有數(shù)據(jù),和是對其進行序列化和反序列化的輔助類。單元隸屬于具體的表單,使用上和表單類互動最多。 轉(zhuǎn)載請注明文章出處:https://tlanyan.me/use-phpexc... PHPOffice出品的PHPExcel是PHP讀取和生成Ex...
摘要:使用好久了,好像今天才想起來要記一篇博客呢。之前一直用的框架,后來做接口的時候打算換成不料機緣巧合之下又結(jié)識了,于是乎決然的站到了的大營之下。今天小記一下這個類庫的常用操作。首先貼上地址,直接去下載最新版好了。 PHP使用好久了,好像今天才想起來要記一篇博客呢。之前一直用的 ci 框架,后來做接口的時候打算換成 tp5, 不料機緣巧合之下又結(jié)識了 node,于是乎決然的站到了 js 的...
摘要:資源網(wǎng)站篇全球最大中文社區(qū),為專業(yè)技術(shù)人員提供最全面的信息傳播和服務(wù)平臺伯樂在線專業(yè)的互聯(lián)網(wǎng)職業(yè)社區(qū)創(chuàng)意工作者們的社區(qū)。 做前端已經(jīng)一年了,開發(fā)中換過很多開發(fā)工具,遇到bug到處求解,以及自學(xué)時到處找相關(guān)文章及教程,所以經(jīng)過這么多的風(fēng)波,我總結(jié)了一些對大家有幫助的網(wǎng)站,主題也將長期更新。 資源網(wǎng)站篇 CSDN:全球最大中文IT社區(qū),為IT專業(yè)技術(shù)人員提供最全面的信息傳播和服務(wù)平臺 ...
閱讀 1039·2021-09-13 10:29
閱讀 3390·2019-08-29 18:31
閱讀 2633·2019-08-29 11:15
閱讀 3012·2019-08-26 13:25
閱讀 1369·2019-08-26 12:00
閱讀 2293·2019-08-26 11:41
閱讀 3377·2019-08-26 10:31
閱讀 1488·2019-08-26 10:25