PHP生成/下載表格

複製代碼
        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,',');
複製代碼
相關文章
相關標籤/搜索