1. 程式人生 > >laravel5.4 +PHPoffice+Export.php 匯出Excel表格

laravel5.4 +PHPoffice+Export.php 匯出Excel表格

前端html程式碼:

<a href="#" id="Export"  class="inlineBlock operatBtn"><i class="icon-plus bigger-130"></i>
                匯出
</a> 

Jquery:

var export_condition = {};
   $("#Export").click(function(){
        export_condition.time = $("#search2_time").val();
        export_condition.client = $("#search2_client").val();
        export_condition.username = $("#search2_user_name").val();
        export_condition.count = 0;
        export_condition.filename = "";
        result_export();
    });
   function result_export()
    {
        
        $.post("{{url('/log/log_export')}}",export_condition , function(data){
           // console.log(data);
            if(data.status === 1) {
                // $("#export_show").hide();
                layer.confirm('沒有資料', {
                    btn: ['確定'] //按鈕
                }, function () {
                    layer.closeAll();
                });
            } else if (data.status === 2) {
                package_file(data.filename);
            } else if (data.status === 3) {
                export_condition.count = data.count;
                export_condition.filename = data.filename;
                result_export();
            }
        });
    }
    

    function package_file(filepath)
    {
        //console.log(filepath);
        $.post("{{url('/log/actionPackage')}}", {filepath : filepath}, function(data){
            // $("#export_show").hide();
            if (data.status === true) {

                layer.confirm('匯出完畢,是否下載?', {
                    btn: ['確定', '取消'] //按鈕
                }, function () {
                    layer.closeAll();
                    window.location.href = "/storage/exports/" + data.filename;
                }, function () {
                });
            } else {
                layer.confirm('匯出失敗', {
                    btn: ['確定'] //按鈕
                }, function () {
                    layer.closeAll();
                });
            }
        })
    }

php:

寫方法之前引入Export.php類檔案:

require_once 'app/Http/Models/Home/Export.php';

public function log_export()
    {
        $where = [];
        if(request('time')){
            $start = date("Y-m-d",strtotime(explode('-', request('time'))[0]));
            $end   = date("Y-m-d",strtotime(explode('-', request('time'))[1]))." 23:59:59";
            $where[] = ["time",">=",$start];
            $where[] = ["time","<=",$end];
        }

        if(request('client')){
            $where[] = ["client",'=',request('client')];
        }
        if(request('user_name')){
            $where[] = ["username",'=',request('user_name')];
        }
        $filename = request('filename');
        $count = request('count');
        $offset = $count * 10000;
        $data = Log::where($where)->orderBy('time','desc')->offset($offset)->limit(10000)->get()->toArray();

        foreach ($data as $key => $value) {
            $data[$key]['level'] = $value['level']==3?'失敗':'成功';
        } 
        $colFilter = function($col){
            return $this->index_col2name($col);
        };
        $valueFilter = function($col, $value) {
            return $this->col2value($col, $value);
        };
        $res = Export::excel($data, $colFilter, $valueFilter, $filename, $count);
        return $res;
    }
    public function actionPackage()
    {
        
        $status = false;
        $filePath = request('filepath');
        $rootPath = '/home/wwwroot/www/storage/exports/';
        //dump($filePath);die;
        if (is_dir($rootPath.$filePath))
        { 
            $cmd = "cd ". $rootPath . $filePath . "/" . "\n";
            $cmd .= "tar -zcf " . $rootPath . $filePath . ".tar.gz  * ";
            $result = system($cmd);
            if (file_exists($rootPath . $filePath . ".tar.gz"))
            {
                $status = true;
            }

            $cmd = "cd ". $rootPath . "\n";
            $cmd .= "rm " . $filePath . " -rf";
            $result = system($cmd);
        } 
        $res = ['status' => $status, 'filename' => $filePath . ".tar.gz "];
        return $res;
    }

Export.php

<?php
/**
 * Created by zhou.
 * User: zhou
 * Date: 2015/9/17
 * Time: 15:16
 */

namespace App\Http\Controllers\Home;
use PHPExcel;
use PHPExcel_IOFactory;

class Export
{
    public static function excel($data, callable $colCallback = null, callable $valueCallback = null, $filename = "", $count)
    {
       
        //dump($data);
        $rootPath = './storage/exports/';
     
        $objPHPExcel = new PHPExcel();
        $objPHPExcel->getProperties()->setCreator("Byzoro百卓網路")
            ->setTitle("Byzoro百卓網路");
    
        if (isset($data["models"])) {
            $data = $data["models"];
        }

        $data_count = count($data);
        //$data_count = 0;
        if ($data_count == 0 && $filename == ""){
            return array('status' => 1,'message' => '無資料匯出');
        } else if ($data_count === 0 && $filename !== "") {
            return array('status' => 2,'message' => '匯出完畢','filename' => $filename,'count' => $count);
        }
       // var_dump($data);die;
        $colscount = 0;
        $linecount = 2;
        $cols      = [];
        $wcols     = [];

        foreach ($data as $key => $row) {
            foreach ($row as $col => $value) {
                if (!isset($cols[$col])) {
                    $c = $col;
                    $colCallback !== null && $c = $colCallback($col);
                    if ($c === "") continue;
                    $intCol     = self::int2col($colscount);
                    $wcols[$c]  = $intCol;
                    $cols[$col] = $intCol;
                    $colscount++;
                }
                $valueCallback !== null && $value = $valueCallback($col, $value);
                $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue($cols[$col] . $linecount, $value);
            }
            $linecount++;
        }
        $objActSheet = $objPHPExcel->getActiveSheet();
        foreach ($wcols as $c => $v) {
            $objPHPExcel->setActiveSheetIndex(0)
                ->setCellValue($v . 1, $c);
            $objActSheet->getColumnDimension($v)->setWidth(20);
        }

        // header('Content-Type: application/Excel2007');
        // header('Content-Disposition: attachment;filename="Export_' . date("Y_m_d_H_i_s", time()) . '.xls"');
        // header('Cache-Control: max-age=0');
 
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        // $objWriter->save('php://output');
        //dump($objWriter);die;

       
        $count++;
        $filename = $filename == "" ? "Export_" . date("Y_m_d_H_i_s", time()) : $filename;

        if (!is_dir($rootPath.$filename))
        { 
            mkdir ($rootPath.$filename, 0777);
            //md ($rootPath.$filename);
        } 
        $savename = $rootPath.$filename."/".$filename."(".$count.")".".xls";

        $objWriter->save($savename);
        // Byzoro::$app->end();
        if ($data_count < 10000) {
            return array('status' => 2,'message' => '匯出完畢','filename' => $filename,'count' => $count);
        } else {
            return array('status' => 3,'filename' => $filename,'count' => $count);
        }
    }

    public static function int2col($int)
    {
        $c = ["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"];
        if ($int < 26) {
            return $c[$int];
        } elseif ($int > 255) {
            throw new Exception("ExportExcel列過多");
        } else {
            $y = $int % 26;
            $i = (intval($int / 26)) - 1;
            return $c[$i] . $c[$y];
        }
    }

}