摘要:本篇文章主要講述,如何在中使用中導(dǎo)出文件,是博主在實(shí)踐了好多篇?jiǎng)e人的帖子之后,總結(jié)歸納出來(lái)的文章,親測(cè)可用。我的博客歡迎騷擾原文地址用導(dǎo)出文件。將文件,重命名成。文章結(jié)束,歡迎轉(zhuǎn)載。
本篇文章主要講述,如何在thinkPHP中使用PHPExcel中導(dǎo)出Excel文件,是博主在實(shí)踐了好多篇?jiǎng)e人的帖子之后,總結(jié)歸納出來(lái)的文章,親測(cè)可用。thinkPHP版本是3.2。
我的博客:Mine-MuYan,歡迎騷擾,原文地址:ThinkPHP用PHPExcle導(dǎo)出Excel文件。
準(zhǔn)備工作 下載、配置PHPExcel擴(kuò)展插件去PHPExcel的官網(wǎng)或者github去下載最新PHPExcel放到ThinkPHP/Library/Vendor目錄下,Vendor目錄是放置PHP擴(kuò)展包的默認(rèn)文件夾,在Vendor目錄下建立PHPExcel文件夾,將下載的文件,解壓到此處。
將PHPExcel.php文件,重命名成PHPExcel.class.php。
至此,插件安裝已經(jīng)做好,目錄結(jié)構(gòu)如下圖,接下來(lái)做功能部分。
創(chuàng)建Excel方法 生成Excel文件方法/** * 數(shù)據(jù)導(dǎo)出為.xls格式 * @param string $fileName 導(dǎo)出的文件名 * @param $expCellName array -> 數(shù)據(jù)庫(kù)字段以及字段的注釋 * @param $expTableData Model -> 連接的數(shù)據(jù)庫(kù) */ public function exportExcel($fileName="table",$expCellName,$expTableData){ $xlsTitle = iconv("utf-8", "gb2312", $fileName);//文件名稱 $xlsName = $fileName.date("_Y.m.d_H.i.s"); //or $xlsTitle 文件名稱可根據(jù)自己情況設(shè)定 $cellNum = count($expCellName); $dataNum = count($expTableData); import("Vendor.PHPExcel.PHPExcel"); import("Vendor.PHPExcel.Writer.Excel5"); import("Vendor.PHPExcel.IOFactory.php"); $objPHPExcel = new PHPExcel(); $cellName = 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","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ"); $objPHPExcel->getActiveSheet(0)->mergeCells("A1:".$cellName[$cellNum-1]."1");//合并單元格 $objPHPExcel->setActiveSheetIndex(0)->setCellValue("A1", $fileName." Export time:".date("Y-m-d H:i:s")); for($i=0;$i<$cellNum;$i++){ $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i]."2", $expCellName[$i][1]); } // Miscellaneous glyphs, UTF-8 for($i=0;$i<$dataNum;$i++){ for($j=0;$j<$cellNum;$j++){ $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$expCellName[$j][0]]); } } header("pragma:public"); header("Content-type:application/vnd.ms-excel;charset=utf-8;name="".$xlsTitle.".xls""); header("Content-Disposition:attachment;filename=$xlsName.xls");//attachment新窗口打印inline本窗口打印 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel5"); $objWriter->save("php://output"); exit; }方法生成說(shuō)明 第9行的
$xlsName = $fileName.date("_Y.m.d_H.i.s"); //or $xlsTitle 文件名稱可根據(jù)自己情況設(shè)定
是設(shè)置文件名,上面所寫是文件名_Y.m.d_H.i.s,_Y.m.d_H.i.s即是導(dǎo)出的時(shí)間,因?yàn)閣indows下,文件名中不能含有:,所以即便寫成_Y.m.d_H:i:s,導(dǎo)出的文件也是_Y.m.d_H.i.s這種樣式。
第13行~15行的import("Vendor.PHPExcel.PHPExcel"); import("Vendor.PHPExcel.Writer.Excel5"); import("Vendor.PHPExcel.IOFactory.php");
這三行即是引入PHPExcel,因?yàn)楫?dāng)時(shí)的文件目錄結(jié)構(gòu)是ThinkPHP/Library/Vendor/PHPExcel,所以import("Vendor.PHPExcel.PHPExcel");,注意目錄結(jié)構(gòu),只要引入的位置和放置PHPExcel的目錄相同即可;
第20、21行的$objPHPExcel->getActiveSheet(0)->mergeCells("A1:".$cellName[$cellNum-1]."1");//合并單元格 $objPHPExcel->setActiveSheetIndex(0)->setCellValue("A1", $fileName." Export time:".date("Y-m-d H:i:s"));
此作用是,在Excel文件的第一行合并一行單元格,用作表格的標(biāo)題或簡(jiǎn)介。如下圖所示:
setCellValue("A1", $fileName." Export time:".date("Y-m-d H:i:s"));值可以根據(jù)自己需求修改;
第34行的header("Content-Disposition:attachment;filename=$xlsName.xls");//attachment新窗口打印inline本窗口打印
可以設(shè)置輸出的文件格式,此處寫的是.xls,可修改成.xlsx。
三個(gè)參數(shù)此方法調(diào)用時(shí)需要傳入三個(gè)參數(shù)(在方法開頭的注釋中已經(jīng)說(shuō)了),這里再具體說(shuō)明一下:
$fileName 導(dǎo)出的文件的文件名 $expCellName 數(shù)據(jù)庫(kù)字段以及字段的注釋(數(shù)組) $expTableData 連接的數(shù)據(jù)庫(kù)方法調(diào)用 調(diào)用方法
/**導(dǎo)出**/ public function msgOut(){ $excel = A("Excel"); $xlsCell = array( array("id", "ID"), array("staff_name", "昵稱"), array("staff_real", "真實(shí)姓名"), array("mobile", "手機(jī)號(hào)"), array("card_id", "身份證號(hào)"), array("referee", "推薦人"), array("game_id", "游戲ID"), array("money", "余額"), array("consume_coin", "消費(fèi)幣"), array("create_time", "注冊(cè)時(shí)間"), array("status", "狀態(tài)"), ); $xlsName = "Staff表搜索結(jié)果導(dǎo)出"; $field = null; foreach ($xlsCell as $key => $value) { if($key == 0){ $field = $value[0]; }else{ $field .= "," . $value[0]; } } $xlsModel = M("Staff"); if (IS_POST) { $map = $this -> _queryTime(); $staff_name = I("staff_name"); if($staff_name) { if (is_numeric($staff_name)) { $map["id|staff_name"] = array(intval($staff_name), array("like", "%" . $staff_name . "%"), "_multi" => true); } else { $map["staff_name"] = array("like", "%" . (string)$staff_name . "%"); } } $xlsData = $xlsModel->Field($field)->where($map)->order("id DESC")->select(); } foreach ($xlsData as $k => $v) { $xlsData[$k]["create_time"] = $v["create_time"] == null ? "-" : date("Y-m-d H:i",$v["create_time"]); $xlsData[$k]["status"] = $v["status"] == 1 ? "正常" : "禁用"; } $excel->exportExcel($xlsName,$xlsCell,$xlsData); }調(diào)用說(shuō)明 第3行
$excel = A("Excel");
這個(gè)方法我寫在了Application/Admin/Controller/ExcelController.class.php中,當(dāng)前用的控制器是MainController.class.php,調(diào)用其他控制器中的方法,用TP中自帶的A(),所以第51行,用的是$excel->exportExcel($xlsName,$xlsCell,$xlsData);,如果你的exportExcel()方法和當(dāng)前調(diào)用的方法在同一個(gè)控制器內(nèi),那么第三行可以不寫,第51行改成$this->exportExcel($xlsName,$xlsCell,$xlsData);。
$xlsCell是導(dǎo)出這張表中所有的字段,以及字段的注釋,導(dǎo)出后,不能把字段作為表格的列名,不知道數(shù)據(jù)庫(kù)字段是什么意思的用戶,看了這張表也不知所以然。
第17~24行是根據(jù)$xlsCell數(shù)組中,提取出來(lái)字段名,作為一個(gè)字符串,在查詢時(shí)使用。當(dāng)然也可以把這個(gè)字段名的字符串手寫出來(lái),我這里用的是foreach處理。
第27~38行是查詢條件和查詢結(jié)果,如果沒有查詢條件,想把整張表導(dǎo)出的話,直接用 $xlsData = $xlsModel->Field($field)->order("id DESC")->select();即可。
第47~50行是對(duì)$xlsData結(jié)果進(jìn)行處理,我寫的兩個(gè)意思是:
1.當(dāng)`create_time`字段為空的時(shí)候,值為 `-` ,有值的時(shí)候,就用`date()`函數(shù)把時(shí)間戳處理成日期; 2.當(dāng)`status`字段的值為1的時(shí)候,顯示為`正常`,當(dāng)值為0的時(shí)候`禁用`。
有點(diǎn)羅嗦了,見諒。
模板文件模板文件很簡(jiǎn)單,就一個(gè)提交。
form表單中三個(gè)input,是搜索條件,如果沒有的話,直接寫button即可。
文章結(jié)束,歡迎轉(zhuǎn)載。文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30592.html
摘要:介紹最近項(xiàng)目中讓實(shí)現(xiàn)一個(gè)導(dǎo)入導(dǎo)出的功能,查找了一些插件后發(fā)現(xiàn)這個(gè)插件,所以就嘗試使用了一下,這里將使用方法和遇到的問(wèn)題簡(jiǎn)單記錄一下。 介紹 最近項(xiàng)目中讓實(shí)現(xiàn)一個(gè)導(dǎo)入導(dǎo)出Excel的功能,查找了一些插件后發(fā)現(xiàn)js-xlsx這個(gè)插件,所以就嘗試使用了一下,這里將使用方法和遇到的問(wèn)題簡(jiǎn)單記錄一下。 SheetJS js-xlsx 是一款能夠讀寫多種格式表格的插件,瀏覽器支持良好,并且能在多個(gè)...
摘要:上傳添加需下載類文件,引入到項(xiàng)目類庫(kù)里接收前臺(tái)文件,接收前臺(tái)文件重設(shè)置文件名設(shè)置移動(dòng)路徑表用函數(shù)方法返回?cái)?shù)組創(chuàng)建一個(gè)讀取數(shù)據(jù),可用于入庫(kù)引用類靜態(tài)類設(shè)置為代表支持或以下版本,代表版開始讀取上傳到服務(wù)器中的文件,返回一個(gè)二維數(shù)組 1.上傳添加excel (需下載PHPExcel類文件,引入到項(xiàng)目類庫(kù)里) //接收前臺(tái)文件, public function addExcel() ...
摘要:目前導(dǎo)出方式占用內(nèi)存較大。比如有些狀態(tài)字段,數(shù)據(jù)庫(kù)存的就是數(shù)字或只占一個(gè)字節(jié),完全換成中文狀態(tài)的話,可能達(dá)個(gè)字節(jié)甚至更多。若是必須要用中文形式。中文亂碼解決的話,其實(shí)也很簡(jiǎn)單,函數(shù),將轉(zhuǎn)為編碼,在中打開就不會(huì)錯(cuò)了 問(wèn)題描述:目前、一般情況下,在web開發(fā)過(guò)程中,使用導(dǎo)入導(dǎo)出報(bào)表的情形很多。我們先說(shuō)導(dǎo)出。項(xiàng)目數(shù)據(jù)量多導(dǎo)出行數(shù)較多,50萬(wàn)行左右,選擇的是csv方式導(dǎo)出。針對(duì)以下應(yīng)用場(chǎng)景,導(dǎo)...
閱讀 3026·2020-01-08 12:17
閱讀 2000·2019-08-30 15:54
閱讀 1157·2019-08-30 15:52
閱讀 2043·2019-08-29 17:18
閱讀 1052·2019-08-29 15:34
閱讀 2466·2019-08-27 10:58
閱讀 1868·2019-08-26 12:24
閱讀 377·2019-08-23 18:23