Laravel-Excel

方式一

安裝&配置

使用Composer安裝依賴(lài)

composer create-project laravel/laravel laravel-excel --prefer-dist "5.5.*" && cd laravel-excel
composer require maatwebsite/excel ~2.1

要加上~2.1斥赋,因?yàn)楝F(xiàn)在已經(jīng)更新到3.0版本了,如果不加會(huì)報(bào)錯(cuò)故响,例如下

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)Call to undefined method Maatwebsite\Excel\Excel::create(),

修改項(xiàng)目設(shè)置

在config/app.php中注冊(cè)服務(wù)提供者到providers數(shù)組:

Maatwebsite\Excel\ExcelServiceProvider::class,

在config/app.php中注冊(cè)門(mén)面到aliases數(shù)組:

'Excel' => Maatwebsite\Excel\Facades\Excel::class,

生成excel.php配置文件

執(zhí)行Artisan命令:

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" 

修改生成的config/excel.php文件 431行

'to_ascii' => false,

測(cè)試Excel文件

創(chuàng)建控制器

php artisan make:controller ExcelController 

定義路由

Route::get('excel/export','ExcelController@export');
Route::get('excel/import','ExcelController@import');

控制器代碼

<?php
namespace App\Http\Controllers;
use App\Http\Requests;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Excel;

class ExcelController extends Controller
{
    public function export()
    {
        $cellData = [
            ['id','姓名','年齡'],
            ['10001','張三','19'],
            ['10002','李四','22'],
            ['10003','王五','23'],
            ['10004','趙六','19'],
            ['10005','猴七','22'],
        ];
        $name = iconv('UTF-8', 'GBK', '成員信息');
        Excel::create($name,function($excel) use ($cellData){
            $excel->sheet('score', function($sheet) use ($cellData){
                $sheet->rows($cellData);
            });
        })->store('xls')->export('xls');
    }
    public function import(){
        $filePath = 'storage/exports/'.iconv('UTF-8', 'GBK', '成員信息').'.xls';
        Excel::load($filePath, function($reader) {
            $data = $reader->all(); dump($data);
        });
        exit;
    }
}

直接訪問(wèn)路由即可下載xls文件
store方法,將該Excel文件保存到服務(wù)器上,文件默認(rèn)保存到storage/exports目錄下,iconv()是為了防止文件名中文亂碼。

配置

//配置列寬
$sheet->setWidth(array(
     'A' => 10,
     'B' => 15,
     'C' => 15,
     'D' => 10
));
//配置行高
$sheet->setHeight(array(
     1 => 20,
     2 => 20,
     3 => 20,
     4 => 20,
     5 => 20
));
//A1到D1單元格合并
$sheet->mergeCells('A1:D1');
//A3到A4單元格合并
$sheet->setMergeColumn(array(
     'columns' => array('A'),
     'rows' => array(
          array(3, 4),
     )
));
//居中
$style = array(
     'alignment' => array(
          'vertical' => \PHPExcel_Style_Alignment::VERTICAL_CENTER,
          'horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
     )
);
$sheet->getDefaultStyle()->applyFromArray($style);
//A1:D1合并單元格居中
$sheet->getStyle("A1:D1")->applyFromArray($style);
//A3:A4合并單元格居中
$sheet->getStyle("A3:A4")->applyFromArray($style);

//設(shè)置A2單元格邊框
$sheet->cells('A2', function ($cells) {
     $cells->setBorder('thin', 'thin', 'thin', 'thin');
});

方式二

安裝

composer require maatwebsite/excel

注冊(cè)config/app.php

'providers' => [
     /*
      * Package Service Providers...
      */
     Maatwebsite\Excel\ExcelServiceProvider::class,
]
'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]

創(chuàng)建一個(gè)新配置文件config/excel.php拇泣。

php artisan vendor:publish

創(chuàng)建導(dǎo)出類(lèi)

php artisan make:export OrderExport

導(dǎo)出類(lèi)代碼

<?php

   namespace App\Exports;

   use Maatwebsite\Excel\Concerns\FromCollection;    // 導(dǎo)出集合
   use Maatwebsite\Excel\Concerns\WithEvents;     // 自動(dòng)注冊(cè)事件監(jiān)聽(tīng)器
   use Maatwebsite\Excel\Concerns\WithStrictNullComparison;    // 導(dǎo)出 0 原樣顯示,不為 null
   use Maatwebsite\Excel\Concerns\WithTitle;    // 設(shè)置工作?名稱(chēng)
   use Maatwebsite\Excel\Events\AfterSheet;    // 在工作表流程結(jié)束時(shí)會(huì)引發(fā)事件
 
   class BillExport implements FromCollection, WithTitle, WithEvents, WithStrictNullComparison
   {
       public $data;

       public $dateTime;

       public $payways;

       public function __construct(array $data, $dateTime, $payways)
       {
           $this->data     = $data;
           $this->dateTime = $dateTime;
           $this->payways  = $payways;
       }

       /**
        * registerEvents    freeze the first row with headings
        * @return array
        * @author   liuml  <liumenglei0211@163.com>
        * @DateTime 2018/11/1  11:19
        */
       public function registerEvents(): array
       {
           return [
               AfterSheet::class => function(AfterSheet $event) {
                // 合并單元格
                   $event->sheet->getDelegate()->setMergeCells(['A1:O1', 'A2:C2', 'D2:O2']);
                   // 凍結(jié)窗格
                   $event->sheet->getDelegate()->freezePane('A4');
                   // 設(shè)置單元格內(nèi)容居中
                   $event->sheet->getDelegate()->getStyle('A1:A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
                   // 定義列寬度
                   $widths = ['A' => 10, 'B' => 15, 'C' => 25,...];
                   foreach ($widths as $k => $v) {
                    // 設(shè)置列寬度
                       $event->sheet->getDelegate()->getColumnDimension($k)->setWidth($v);
                   }
                   // 其他樣式需求(設(shè)置邊框矮锈,背景色等)處理擴(kuò)展中給出的宏霉翔,也可以自定義宏來(lái)實(shí)現(xiàn),詳情見(jiàn)官網(wǎng)說(shuō)明
                   ...
               },
           ];
       }

       /**
        * 需要導(dǎo)出的數(shù)據(jù)統(tǒng)一在這個(gè)方法里面處理 這個(gè)方法里面也可以直接用 Model取數(shù)據(jù)
        * 我這里的數(shù)據(jù)是 Controller 傳過(guò)來(lái)的苞笨,至于怎么傳的看下面給出的 Controller 里面的代碼就知道了
        * 里面數(shù)據(jù)處理太長(zhǎng)了债朵,多余的我都用 ... 表示,大家明白就行
        * @return \Illuminate\Support\Collection
        */
       public function collection()
       {
           $i         = 1;
           $total_amount = 0;    // 交易金額總計(jì)
           if (empty($this->data)) {
               foreach ($this->data as $key => $vo) {
                    ...
                    
                   $data[$key]['num'] = $i;    // 編號(hào)
                   $data[$key]['consume_type'] = $vo['consume_type'];    // 項(xiàng)目類(lèi)型
                   ...
                   
                   $total_amount += $data[$key]['total_amount '];    // 交易金額總計(jì)
                   $i++;
               }
           }

           $total = ['總計(jì)', ...];

           $data[]   = $total;
           $title    = [$this->payways . '對(duì)賬單'];
           $headings = ['編號(hào)', ...];
           $date     = ['下載時(shí)間:' . date('Y-m-d H:i:s'), '', '', '數(shù)據(jù)時(shí)間范圍:' . $this->dateTime];
           array_unshift($data, $title, $date, $headings);
        // 此處數(shù)據(jù)需要數(shù)組轉(zhuǎn)集合
           return collect($data);
       }

       public function title(): string
       {
        // 設(shè)置工作?的名稱(chēng)
           return $this->payways . '賬單明細(xì)';
       }
   }

Controller 中的調(diào)用方法

public function billExportExcel(OrderRequest $request)
{
    $start_date = $request->get('start_date', '');
    $end_date   = $request->get('end_date', '');
    $payways    = $request->get('payways', '');
    $data       = $this->OrdersLogic->BillExportExcel($request->all());
    // download 方法直接下載瀑凝,store 方法可以保存序芦。具體的導(dǎo)出類(lèi)型等看官方的文檔吧
    return Excel::download(new BillExport($data, $start_date . '-' . $end_date, $payways, '**賬單-' . date('Y-m-d_H_i_s') . '.xls');
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粤咪,隨后出現(xiàn)的幾起案子谚中,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏杖,死亡現(xiàn)場(chǎng)離奇詭異将塑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蝌麸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)点寥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人来吩,你說(shuō)我怎么就攤上這事敢辩。” “怎么了弟疆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵戚长,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我怠苔,道長(zhǎng)同廉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任柑司,我火速辦了婚禮迫肖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攒驰。我一直安慰自己蟆湖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布玻粪。 她就那樣靜靜地躺著隅津,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劲室。 梳的紋絲不亂的頭發(fā)上伦仍,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音痹籍,去河邊找鬼呢铆。 笑死晦鞋,一個(gè)胖子當(dāng)著我的面吹牛蹲缠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悠垛,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼线定,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了确买?” 一聲冷哼從身側(cè)響起斤讥,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芭商,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體派草,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年铛楣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了近迁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡簸州,死狀恐怖鉴竭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岸浑,我是刑警寧澤搏存,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站矢洲,受9級(jí)特大地震影響璧眠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜读虏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一蛆橡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掘譬,春花似錦泰演、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至靴拱,卻和暖如春垃喊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袜炕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工本谜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偎窘。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓乌助,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陌知。 傳聞我的和親對(duì)象是個(gè)殘疾皇子他托,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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