Loader::import('PHPExcel.Classes.PHPExcel'); // tp5中只需將phpexcel文件放入extend文件夾中,便可採用該方法引入,須要先 use think\Loader $objPHPExcel = new \PHPExcel(); // 建立對象 $objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // 水平居中 $objPHPExcel->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); // 上下居中 $sheet = $objPHPExcel -> getActiveSheet(); $sheet -> getColumnDimension('A')->setWidth(22); // 設置單元格寬度 $sheet -> getColumnDimension('B')->setWidth(15); $sheet -> getColumnDimension('C')->setWidth(15); $sheet -> getColumnDimension('D')->setWidth(20); $sheet -> getColumnDimension('E')->setWidth(15); $sheet -> getColumnDimension('F')->setWidth(20); $sheet -> getColumnDimension('G')->setWidth(10); $sheet -> getColumnDimension('H')->setWidth(40); $sheet->getStyle( 'A1')->getFont()->setName('Candara' ); // 設置單元格字體 $sheet->getStyle( 'A1')->getFont()->setSize(15); // 設置單元格字體大小 $sheet->getStyle( 'A1')->getFont()->setBold(true); // 字體加粗 $sheet->getStyle( 'B1')->getFont()->setName('Candara' ); $sheet->getStyle( 'B1')->getFont()->setSize(15); $sheet->getStyle( 'B1')->getFont()->setBold(true); $sheet->getStyle( 'B1')->getFont()->setName('Candara' ); $sheet->getStyle( 'B1')->getFont()->setSize(15); $sheet->getStyle( 'B1')->getFont()->setBold(true); $sheet->getStyle( 'C1')->getFont()->setName('Candara' ); $sheet->getStyle( 'C1')->getFont()->setSize(15); $sheet->getStyle( 'C1')->getFont()->setBold(true); $sheet->getStyle( 'D1')->getFont()->setName('Candara' ); $sheet->getStyle( 'D1')->getFont()->setSize(15); $sheet->getStyle( 'D1')->getFont()->setBold(true); $sheet->getStyle( 'E1')->getFont()->setName('Candara' ); $sheet->getStyle( 'E1')->getFont()->setSize(15); $sheet->getStyle( 'E1')->getFont()->setBold(true); $sheet->getStyle( 'F1')->getFont()->setName('Candara' ); $sheet->getStyle( 'F1')->getFont()->setSize(15); $sheet->getStyle( 'F1')->getFont()->setBold(true); $sheet->getStyle( 'G1')->getFont()->setName('Candara' ); $sheet->getStyle( 'G1')->getFont()->setSize(15); $sheet->getStyle( 'G1')->getFont()->setBold(true); $sheet->getStyle( 'H1')->getFont()->setName('Candara' ); $sheet->getStyle( 'H1')->getFont()->setSize(15); $sheet->getStyle( 'H1')->getFont()->setBold(true); $sheet -> setCellValue("A1",'做業題目'); $sheet -> setCellValue("B1",'做業名稱'); $sheet -> setCellValue("C1",'做者'); $sheet -> setCellValue("D1",'提交時間'); $sheet -> setCellValue("E1",'批閱人'); $sheet -> setCellValue("F1",'批閱時間'); $sheet -> setCellValue("G1",'得分'); $sheet -> setCellValue("H1",'評語'); $count = isset($list->count) ? $list->count : $list->subject_count; for($row = 0; $row < $count; $row ++) {// 向單元格中插入內容 $subjectTitle = $list->$row->subjectTitle; $workname = $list->$row->workname; $staffname = $list->$row->staffname; $uptime = $list->$row->uptime; $checkStaff = $list->$row->checkStaff; $checktime = $list->$row->checktime; $score = number_format($list->$row->score,2); $number = $list->$row->comment; $sheet -> setCellValue("A".($row+2),$subjectTitle); $sheet -> setCellValue("B".($row+2),$workname); $sheet -> setCellValue("C".($row+2),$staffname); $sheet -> setCellValue("D".($row+2),$uptime); $sheet -> setCellValue("E".($row+2),$checkStaff); $sheet -> setCellValue("F".($row+2),$checktime); $sheet -> setCellValue("G".($row+2),$score); $sheet -> setCellValue("H".($row+2),$number); } $sheet -> setTitle('批閱列表'); if(!file_exists(config('upload_path').'/excel')){ mkdir(config('upload_path').'/excel'); chmod(config('upload_path').'/excel',0777); } (new \PHPExcel_Writer_Excel2007($objPHPExcel))->save(config('upload_path').'/excel/checklist.xls'); $file_name = "checklist.xls"; $contents = file_get_contents(config('upload_path').'/excel/checklist.xls'); $file_size = filesize(config('upload_path').'/excel/checklist.xls'); header("Content-type: application/octet-stream;charset=utf-8"); header("Accept-Ranges: bytes"); header("Accept-Length: $file_size"); header("Content-Disposition: attachment; filename=".$file_name); exit($contents);
2、不用生成 Excel 文件就強制下載:php
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=工單" . "_" . $localtime . ".xls ");
header("Content-Transfer-Encoding: binary ");
請求頭解釋:
一、header("Pragma: public");
Pragma頭域用來包含實現特定的指令
Pragma: public 意思是 響應可被任何緩存區緩存。
關於Pragma:no-cache,跟Cache-Control: no-cache相同。Pragma: no-cache兼容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。所以,Pragma: no-cache能夠應用到http 1.0 和http 1.1,而Cache-Control: no-cache只能應用於http 1.1.
二、header("Expires: 0");瀏覽器
header("Expires: 0"); 的意思是緩存已過時緩存
Expires實體報頭域給出響應過時的日期和時間。爲了讓代理服務器或瀏覽器在一段時間之後更新緩存中(再次訪問曾訪問過的頁面時,直接從緩存中加載,縮短響應時間和下降服務器負載) 的頁面,咱們可使用Expires實體報頭域指定頁面過時時間。例:Expires:Thu,15 Sep 2006 16:23:12 GMT服務器
HTTP1.1的客戶端和緩存必須將其餘非法的日期格式(包括0)看做已通過期。如:爲了讓瀏覽器不要緩存頁面,也能夠利用Expires實體報關域,設置爲 0app
三、header("Cache-Control: must-revalidate, post-check=0, pre-check=0");post
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 的意思是強制頁面不緩存,post-check=0, pre-check=0這兩個 是 IE 5.0纔有的防cache聲明字體
Cache-Control。它用來指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache -Control並不會修改另外一個消息處理過程當中的緩存處理過程。請求時的緩存指令包括no-cache、no-store、max-age、max- stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。咱們來講說響應消息,由於 它是服務器發出的,對於客戶端和Cache System都有很是重要的意義:
Public 指示響應可被任何緩存區緩存。
Private 指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這容許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其餘用戶的請求無效。
no-cache 指示請求或響應消息不能緩存
no-store 用於防止重要的信息被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存
max-age 指示客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。
no-transform 不容許轉換存儲系統
must-revalidate 使得客戶端再次瀏覽當前頁時必須發送相關 HTTP 頭信息到服務器進行驗證,而後才決定是否加載客戶端本地 cachethis
四、header("Content-Type: application/force-download");編碼
header("Content-Type: application/force-download"); 的意思是 強制下載spa
五、header("Content-Type: application/octet-stream");
不知道下載文件的類型時使用,採用二進制流
六、header("Content-Disposition: attachment;filename=附件名.xls ");
意思是 類型爲附件, 附件名爲 :附件名.xls
七、header("Content-Transfer-Encoding: binary ");
意思是採用二進制進行傳輸
Transfer-Encoding 告知接收端爲了保證報文的可靠傳輸,對報文采用了什麼編碼方式
3、用數據生成 excel 並下載(不用生成臨時文件)
<?php include_once "phpexcel/PHPExcel.php";
$cfg_columns = array( 'date' => array( 'name' => '日期', 'type' => 'label', 'width' => 100 ), 'name' => array( 'name' => '姓名', 'type' => 'label', 'width' => 100 ), 'dept_name' => array( 'name' => '部門', 'type' => 'label', 'width' => 100 ), ); $list = array( 0 => array( 'date' => '2017-12-01 10:32:45', 'name' => '張三', 'dept_name' => '研發部', ), 1 => array( 'date' => '2017-12-02 10:32:45', 'name' => '李四', 'dept_name' => '客服部', ), 2 => array( 'date' => '2017-12-03 10:32:45', 'name' => '王五', 'dept_name' => '人力資源部', ), ); $filename = 'test.xls'; header('Pragma:public'); header('Content-Type:application/x-msexecl;name="'.$filename.'"'); header('Content-Disposition:inline;filename="'.$filename.'"'); $objPHPExcel = new PHPExcel(); $objPHPExcel->getActiveSheet(0)->mergeCells('B1:D1'); $export_time = date('Y-m-d H:i:s'); $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', '導出時間:'); $objPHPExcel->setActiveSheetIndex(0)->setCellValue('B1', $export_time); $cols = 'A'; foreach ($cfg_columns as $val){ $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cols++.'2',$val['name']); } //第三行, 輸出詳細數據 $rows = 3; foreach ($list as $fields){ $cols = 'A'; //按cfg_column的配置項導出 foreach ($cfg_columns as $k => $val){ if(empty( $fields[$k])){ $objPHPExcel->getActiveSheet()->setCellValue($cols++.$rows, 0); }else{ $objPHPExcel->getActiveSheet()->setCellValue($cols++.$rows, $fields[$k]); } } //end foreach ($cfg_column as $key => $val) $rows ++; } $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); exit;
若是遇到須要導出的表格包含複選框等各類格式,能夠先生成生個視圖,在渲染視圖$this->display() 以前使用header()下載,下載的文件名爲 xxx.xls ,就能夠將整個表格下載到excel啦。
四、讀取 excel 文件內容,並變成一個由 , 分割的字符串
include_once "phpexcel/PHPExcel.php"; $filePath = $_FILES['file']['tmp_name']; $PHPExcel = new PHPExcel(); /**默認用excel2007讀取excel,若格式不對,則用以前的版本進行讀取*/ $PHPReader = new PHPExcel_Reader_Excel2007(); if(!$PHPReader->canRead($filePath)){ $PHPReader = new PHPExcel_Reader_Excel5(); if(!$PHPReader->canRead($filePath)){ echo 'no Excel'; return ; } } $PHPExcel = $PHPReader->load($filePath); /**讀取excel文件中的第一個工做表*/ $currentSheet = $PHPExcel->getSheet(0); /**取得最大的列號*/ $allColumn = $currentSheet->getHighestColumn(); /**取得一共有多少行*/ $allRow = $currentSheet->getHighestRow(); /**從第二行開始輸出,由於excel表中第一行爲列名*/ $temStr = ""; for($currentRow = 2;$currentRow <= $allRow;$currentRow++){ /**從第A列開始輸出*/ for($currentColumn= 'A';$currentColumn<= $allColumn; $currentColumn++) { $temStr .= $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)->getValue(); $temStr .=','; } } $temStr = rtrim($temStr,',');