php讀取excel文件數(shù)據(jù)的導(dǎo)入和導(dǎo)出

在之前有寫過(guò)一篇文章講述了使用PHP快速生成excel表格文件并下載,這種方式生成Excel文件,生成速度很快,但是有缺點(diǎn)是:
1.單純的生成Excel文件,生成的文件沒(méi)有樣式,單元格屬性(填充色,寬度,高度,邊框顏色...)不能自定義;
2.生成的文件雖然可以打開(kāi),但是兼容性很差,每次打開(kāi),都會(huì)報(bào)一個(gè)警告:

image

今天使用一個(gè)第三方的SDK(PHPExcel)實(shí)現(xiàn)Excel文件的導(dǎo)入和導(dǎo)出衣形。

準(zhǔn)備工作:
1.下載PHPExcel的SDK,下載地址:https://github.com/PHPOffice/PHPExcel伞剑。

2.將SDK解壓之后的Class文件拷貝到自己的項(xiàng)目。

一.Excel文件讀取

1.  function excelToArray(){  
2.  require_once dirname(__FILE__) . '/Lib/Classes/PHPExcel/IOFactory.php';  

4.  //加載excel文件  
5.  $filename = dirname(__FILE__).'/result.xlsx';  
6.  $objPHPExcelReader = PHPExcel_IOFactory::load($filename);    

8.  $sheet = $objPHPExcelReader->getSheet(0);        // 讀取第一個(gè)工作表(編號(hào)從 0 開(kāi)始)  
9.  $highestRow = $sheet->getHighestRow();           // 取得總行數(shù)  
10.  $highestColumn = $sheet->getHighestColumn();     // 取得總列數(shù)  

12.  $arr = array('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');  
13.  // 一次讀取一列  
14.  $res_arr = array();  
15.  for ($row = 2; $row <= $highestRow; $row++) {  
16.  $row_arr = array();  
17.  for ($column = 0; $arr[$column] != 'F'; $column++) {  
18.  $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();  
19.  $row_arr[] = $val;  
20.  }  

22.  $res_arr[] = $row_arr;  
23.  }  

25.  return $res_arr;  
26.  }  

或者:


1.  function excelToArray(){  
2.  require_once dirname(__FILE__) . '/Lib/Classes/PHPExcel/IOFactory.php';  

4.  //加載excel文件  
5.  $filename = dirname(__FILE__).'/result.xlsx';  
6.  $objPHPExcelReader = PHPExcel_IOFactory::load($filename);    

8.  $reader = $objPHPExcelReader->getWorksheetIterator();  
9.  //循環(huán)讀取sheet  
10.  foreach($reader as $sheet) {  
11.  //讀取表內(nèi)容  
12.  $content = $sheet->getRowIterator();  
13.  //逐行處理  
14.  $res_arr = array();  
15.  foreach($content as $key => $items) {  

17.  $rows = $items->getRowIndex();              //行  
18.  $columns = $items->getCellIterator();       //列  
19.  $row_arr = array();  
20.  //確定從哪一行開(kāi)始讀取  
21.  if($rows < 2){  
22.  continue;  
23.  }  
24.  //逐列讀取  
25.  foreach($columns as $head => $cell) {  
26.  //獲取cell中數(shù)據(jù)  
27.  $data = $cell->getValue();  
28.  $row_arr[] = $data;  
29.  }  
30.  $res_arr[] = $row_arr;  
31.  }  

33.  }  

35.  return $res_arr;  
36.  }  

兩種方法均可將表格數(shù)據(jù)轉(zhuǎn)化為數(shù)組,然后哦再進(jìn)行相關(guān)的操作就簡(jiǎn)單了掺喻。

二.Excel文件導(dǎo)出


1.  /** 
2.  * 創(chuàng)建(導(dǎo)出)Excel數(shù)據(jù)表格 
3.  * @param  array   $list        要導(dǎo)出的數(shù)組格式的數(shù)據(jù) 
4.  * @param  string  $filename    導(dǎo)出的Excel表格數(shù)據(jù)表的文件名 
5.  * @param  array   $indexKey    $list數(shù)組中與Excel表格表頭$header中每個(gè)項(xiàng)目對(duì)應(yīng)的字段的名字(key值) 
6.  * @param  array   $startRow    第一條數(shù)據(jù)在Excel表格中起始行 
7.  * @param  [bool]  $excel2007   是否生成Excel2007(.xlsx)以上兼容的數(shù)據(jù)表 
8.  * 比如: $indexKey與$list數(shù)組對(duì)應(yīng)關(guān)系如下: 
9.  *     $indexKey = array('id','username','sex','age'); 
10.  *     $list = array(array('id'=>1,'username'=>'YQJ','sex'=>'男','age'=>24)); 
11.  */  
12.  function exportExcel($list,$filename,$indexKey,$startRow=1,$excel2007=false){  
13.  //文件引入  
14.  require_once APP_ROOT.'/Api/excel/PHPExcel.php';  
15.  require_once APP_ROOT.'/Api/excel/PHPExcel/Writer/Excel2007.php';  

17.  if(empty($filename)) $filename = time();  
18.  if( !is_array($indexKey)) return false;  

20.  $header_arr = array('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');  
21.  //初始化PHPExcel()  
22.  $objPHPExcel = new PHPExcel();  

24.  //設(shè)置保存版本格式  
25.  if($excel2007){  
26.  $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);  
27.  $filename = $filename.'.xlsx';  
28.  }else{  
29.  $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);  
30.  $filename = $filename.'.xls';  
31.  }  

33.  //接下來(lái)就是寫數(shù)據(jù)到表格里面去  
34.  $objActSheet = $objPHPExcel->getActiveSheet();  
35.  //$startRow = 1;  
36.  foreach ($list as $row) {  
37.  foreach ($indexKey as $key => $value){  
38.  //這里是設(shè)置單元格的內(nèi)容  
39.  $objActSheet->setCellValue($header_arr[$key].$startRow,$row[$value]);  
40.  }  
41.  $startRow++;  
42.  }  

44.  // 下載這個(gè)表格,在瀏覽器輸出  
45.  header("Pragma: public");  
46.  header("Expires: 0");  
47.  header("Cache-Control:must-revalidate, post-check=0, pre-check=0");  
48.  header("Content-Type:application/force-download");  
49.  header("Content-Type:application/vnd.ms-execl");  
50.  header("Content-Type:application/octet-stream");  
51.  header("Content-Type:application/download");;  
52.  header('Content-Disposition:attachment;filename='.$filename.'');  
53.  header("Content-Transfer-Encoding:binary");  
54.  $objWriter->save('php://output');  
55.  }  

導(dǎo)出文件,還可以設(shè)置模板


1.  function exportExcel($list,$filename,$indexKey=array()){  
2.  require_once dirname(__FILE__) . '/Lib/Classes/PHPExcel/IOFactory.php';  
3.  require_once dirname(__FILE__) . '/Lib/Classes/PHPExcel.php';  
4.  require_once dirname(__FILE__) . '/Lib/Classes/PHPExcel/Writer/Excel2007.php';  

6.  $header_arr = array('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');  

8.  //$objPHPExcel = new PHPExcel();                        //初始化PHPExcel(),不使用模板  
9.  $template = dirname(__FILE__).'/template.xls';          //使用模板  
10.  $objPHPExcel = PHPExcel_IOFactory::load($template);     //加載excel文件,設(shè)置模板  

12.  $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);  //設(shè)置保存版本格式  

14.  //接下來(lái)就是寫數(shù)據(jù)到表格里面去  
15.  $objActSheet = $objPHPExcel->getActiveSheet();  
16.  $objActSheet->setCellValue('A2',  "活動(dòng)名稱:江南極客");  
17.  $objActSheet->setCellValue('C2',  "導(dǎo)出時(shí)間:".date('Y-m-d H:i:s'));  
18.  $i = 4;  
19.  foreach ($list as $row) {  
20.  foreach ($indexKey as $key => $value){  
21.  //這里是設(shè)置單元格的內(nèi)容  
22.  $objActSheet->setCellValue($header_arr[$key].$i,$row[$value]);  
23.  }  
24.  $i++;  
25.  }  

27.  // 1.保存至本地Excel表格  
28.  //$objWriter->save($filename.'.xls');  

30.  // 2.接下來(lái)當(dāng)然是下載這個(gè)表格了植影,在瀏覽器輸出就好了  
31.  header("Pragma: public");  
32.  header("Expires: 0");  
33.  header("Cache-Control:must-revalidate, post-check=0, pre-check=0");  
34.  header("Content-Type:application/force-download");  
35.  header("Content-Type:application/vnd.ms-execl");  
36.  header("Content-Type:application/octet-stream");  
37.  header("Content-Type:application/download");;  
38.  header('Content-Disposition:attachment;filename="'.$filename.'.xls"');  
39.  header("Content-Transfer-Encoding:binary");  
40.  $objWriter->save('php://output');  
41.  }  

先弄一個(gè)excel模板

image

然后使用該模板導(dǎo)出數(shù)據(jù)

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涎永,隨后出現(xiàn)的幾起案子思币,更是在濱河造成了極大的恐慌,老刑警劉巖羡微,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谷饿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妈倔,警方通過(guò)查閱死者的電腦和手機(jī)博投,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盯蝴,“玉大人毅哗,你說(shuō)我怎么就攤上這事∨跬Γ” “怎么了虑绵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)闽烙。 經(jīng)常有香客問(wèn)我翅睛,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任捕发,我火速辦了婚禮疏旨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爬骤。我一直安慰自己充石,他們只是感情好莫换,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布霞玄。 她就那樣靜靜地躺著,像睡著了一般拉岁。 火紅的嫁衣襯著肌膚如雪坷剧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天喊暖,我揣著相機(jī)與錄音惫企,去河邊找鬼。 笑死陵叽,一個(gè)胖子當(dāng)著我的面吹牛狞尔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巩掺,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偏序,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了胖替?” 一聲冷哼從身側(cè)響起研儒,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎独令,沒(méi)想到半個(gè)月后端朵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡燃箭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年冲呢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片招狸。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敬拓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓢颅,到底是詐尸還是另有隱情恩尾,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布挽懦,位于F島的核電站翰意,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冀偶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一醒第、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧进鸠,春花似錦稠曼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至量瓜,卻和暖如春司恳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绍傲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工扔傅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烫饼。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓猎塞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杠纵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荠耽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,981評(píng)論 3 119
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評(píng)論 25 707
  • 小承諾容易答應(yīng)淡诗,但不容易守骇塘。 很多時(shí)候大人答應(yīng)孩子出去玩,但到最后都變成了“下次”韩容。久而久之款违,孩子不僅覺(jué)得父母不守...
    Janet大昕鼓徵閱讀 144評(píng)論 0 4
  • 路好長(zhǎng),繞著風(fēng)群凶,盤旋插爹。 云在天邊瘋癲, 先哭泣请梢, 又喜悅赠尾。 胡亂搖擺,顫抖毅弧。 太陽(yáng)墜落气嫁,彈起了鋒利的月光, 像刀够坐,...
    米馬閱讀 484評(píng)論 0 2
  • 人生腳本這個(gè)話題似乎更難捉摸寸宵,因?yàn)樗[藏在自己沒(méi)意識(shí)到的潛意識(shí)里崖面,希望通過(guò)后續(xù)的學(xué)習(xí)慢慢你能找到它,完善它梯影。 記憶...
    糠小妮閱讀 382評(píng)論 0 0