[擴充套件]laravel-xlswriter 一款基於xlswriter的laravel擴充套件包 excel極速讀寫

南城以南發表於2021-04-30

Laravel-xlswriter 一款基於xlswriter的laravel擴充套件包

php-xlswriter是一款高效能的excel讀寫擴充套件,laravel-xlswriter基於該擴充套件做了封裝,旨在提供一個便於使用的xlswriterlaravel工具包。
目前laravel-xlswriter支援匯出 讀取功能會在後續版本中加入。
laravel-xlswriter文件
PHP擴充套件Xlswriter文件

如果本擴充套件幫助到了你 歡迎star。

如果本擴充套件有任何問題或有其他想法 歡迎提 issue與pull request。

一、XlsWriter擴充套件介紹

XlsWriterviest開發的一款PHP擴充套件,目前githubstar 數已達到1.6k。開發語言為C語言。以下是官方文件描述:

xlswriter 是一個 PHP C 擴充套件,可用於在 Excel 2007+ XLSX 檔案中讀取資料,插入多個工作表,寫入文字、數字、公式、日期、圖表、圖片和超連結。

它具備以下特性:

一、寫入
100%相容的 Excel XLSX 檔案
完整的 Excel 格式
合併單元格
定義工作表名稱
過濾器
圖表
資料驗證和下拉選單
工作表 PNG/JPEG 影像
用於寫入大檔案的記憶體優化模式
適用於 Linux,FreeBSD,OpenBSD,OS X,Windows
編譯為 32 位和 64 位
FreeBSD 許可證
唯一的依賴是 zlib
二、讀取
完整讀取資料
游標讀取資料
按資料型別讀取
xlsx 轉 CSV

二、Laravel-xlswriter使用教程

環境要求

  • xlswriter 1.3.7
  • PHP > 7.0
    安裝請按照XlsWriter的官方文件:安裝教程

安裝

composer require lysice/laravel-xlswriter

ServiceProvider加入到app.php中:

'providers' => [
     /* * Laravel Framework Service Providers... */ 
     ... 
         \Lysice\XlsWriter\XlsWriterServiceProvider::class 
 ],

釋出FacadeExcel加入到app.php中:

 'aliases' => [ 
    ... 
     'Excel' => \Lysice\XlsWriter\Facade\Writer::class 
  ],

釋出xlswriter.php配置檔案:

 php artisan vendor:publish --provider="Lysice\XlsWriter\XlsWriterServiceProvider"

配置

本擴充套件提供如下幾個選項:
extension: 匯出文件的副檔名 目前只支援xlsx與csv
mode:Xlswriter的匯出方式,可選記憶體方式與常規方式:

 Excel::MODE_NORMAL
 Excel::MODE_MEMORY

export_mode: 本擴充套件支援兩種匯出資料的模式:直接匯出與按行匯出。

Excel::EXPORT_MODE_DATA,
Excel::EXPORT_MODE_ROW,

1.命令

1.1 檢視xlswriter擴充套件是否正常安裝
 php artisan xls:status

展示資訊如下:

laravel-xlsWriter info:
+---------+---------------------------------------------+
| version | 1.0                                         |
| author  | lysice<https://github.com/Lysice>           |
| docs    | https://github.com/Lysice/laravel-xlswriter |
+---------+---------------------------------------------+
XlsWriter extension status:
+-------------------------------+----------------------------+
| loaded                        | yes                        |
| xlsWriter author              | Jiexing.Wang (wjx@php.net) |
| xlswriter support             | enabled                    |
| Version                       | 1.3.7                      |
| bundled libxlsxwriter version | 1.0.0                      |
| bundled libxlsxio version     | 0.2.27                     |
+-------------------------------+----------------------------+

如您的資訊展示如上所示,證明您的cli環境下本擴充套件可用。

1.2.建立Exports類
 php artisan xls:export XXXXExport array

預設在 App\Exports 目錄下建立出你的Export類。
其中 XXXXExport 指定你的匯出類 後面指定匯出型別。
目前支援三種匯出型別:

  • array

    php artisan xls:export XXXXExport array
  • query

    php artisan xls:export XXXXExport query
  • Collection

    php artisan xls:export XXXXExport collection```
    

2.匯出array

<?php

namespace App\Exports;

use Lysice\XlsWriter\Interfaces\FromArray;

class UserExport implements FromArray
{
 /** 
  * @return array */ 
  public function array() : array 
  { 
    return [ ['哈哈', 'aaa'],
         ['哈哈', 'aaa'],
         ['哈哈', 'aaa'],
         ['哈哈', 'aaa']
         ]; 
  }
 /** 
   * @return array 
   */ 
 public function headers() : array {
     return []; 
 }
}
2.1 設定列標題

如果您想設定每列的列標題 則需要給headers方法返回您的title陣列。

/**
 * @return array 
 */ 
 public function headers() : array {
     return []; 
 }

3.下載

3.1 直接下載到本地

使用Excel的Facade:

 Route::get('xls', function() {
     return Excel::download((new \App\Exports\UserExport())); 
 });

此時訪問路由 xls 您可以看到下載的文件。

3.2 指定匯出文件名稱
Route::get('xls', function() {
 // 直接下載
 return Excel::download((new \App\Exports\UserExport()), 'test');});
3.3 指定匯出型別

Excel::download方法接收第三個引數可以指定匯出型別。目前只支援兩種型別:xlsx 與csv。
具體見xlswriter官方文件

Route::get('xls', function() {
 return Excel::download((new \App\Exports\UserExport()), 'test', \Lysice\XlsWriter\Excel::TYPE_CSV);
 });
3.4 指定返回的header

Excel::download方法接收第四個引數,可以指定返回header。

Route::get('xls', function() {
 return Excel::download((new \App\Exports\UserExport()), 'test', \Lysice\XlsWriter\Excel::TYPE_CSV, ['a' => b]);});
3.5 匯出到指定目錄
Excel::store(
 (new \App\Exports\UserExport()), 'store.xlsx', 'public', \Lysice\XlsWriter\Excel::TYPE_CSV);

注意 第三個引數為你的檔案系統配置。你可以在filesystem中指定。如上程式碼 指的是 會將檔案匯出到 storage/app/public下。

'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],
        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],
        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
        ],
    ],
3.6設定文件選項
Excel::store(
 (new \App\Exports\UserExport()), 'store.xlsx', 'public', \Lysice\XlsWriter\Excel::TYPE_CSV, [ 'visibility' => 'private'] );
4.Traits

Exportable 用在Exports中 首先 在export類中引入Trait

use Exportable;

然後就可以直接使用Export的實體類來下載文件:
目前支援兩個方法:downloadstore

  • 下載到本地
    return (new \App\Exports\ExportsExport())->download('2021年3月', \Lysice\XlsWriter\Excel::TYPE_CSV, ['x-download' => true]);
  • 下載到指定目錄
    (new \App\Exports\ExportsExport())->store(
    '2021年4月',
    'public', \Lysice\XlsWriter\Excel::TYPE_XLSX,['visibility' => 'private']
    );

5.圖表

圖表支援的型別均定義在 Lysice\XlsWriter\Supports\Chart中以Chart_為字首的型別
要想在文件中新增圖表 需要使得你的export類實現WithCharts契約 然後在charts方法中實現你的配置

class ChartsExport implements FromArray, WithCharts{
 }
面積圖 直方圖 條形圖 折線圖 圓環圖 雷達圖的配置類似

如下配置

public function charts()
 { 
     return 
    [
        [ 
            'type' => Constants::CHART_AREA_PERCENT, 
            'title' => '圖表標題',
             'style' => 47,
            'xName' => 'X name',
            'yName' => 'Y name',
            'row' => 0,
            'column' => 3,
            'series' => [
                [ 'name' => 'name1', 'data' => '=Sheet1!$B$1:$B$6', ],
                [ 'name' => 'name2', 'data' => '=Sheet1!$A$1:$A$6', ],
                [ 'name' => 'name3', 'data' => '=Sheet1!$D$1:$D$6', ],
                [ 'name' => 'name4', 'data' => '=Sheet1!$C$1:$C$6', ]
            ] 
        ] 
    ]; 
 }
餅圖

設定的系列資料只有首個元素可應用 因此只需要設定一個陣列即可。
還可以給資料設定分類.指定要取得分類單元格

6.自動過濾

export類實現WithFilter介面 指定過濾範圍的單元格

 public function filter(): string { 
     return 'A1:D1'; 
 }

7.單元格樣式

7.1 預設單元格樣式

文件可以分別為設定預設的單元格樣式。

  • 1.約定契約
    implements WithDefaultFormat
  • 2.新增樣式
    /** 
     * @return array * @throws \Lysice\XlsWriter\Exceptions\FormatParamErrorException 
     */ 
     public function defaultFormats(): array {
         $formatOne = DefaultFormat::create()
          ->border(12)
          ->background(Constants::COLOR_MAGENTA); 
          $formatTwo = DefaultFormat::create()
          ->underline( Constants::UNDERLINE_SINGLE)
          ->wrap(); 
      return [$formatOne, $formatTwo]; 
    }
    該方法返回一個DefaultFormat物件陣列,當DefaultFormat數量為1時 預設為內容設定樣式。若=2 則以陣列0作為header樣式, 以陣列1的物件作為內容樣式。
7.2 列樣式支援
7.3 單元格樣式支援

當前單元格支援的樣式分別有:

  • 1.bold() 加粗
  • 2.italic() 斜體
  • 3.border() 邊框

Border取值:

\Lysice\XlsWriter\Supports\Constants

Constants::BORDER_THIN                // 薄邊框風格
Constants::BORDER_MEDIUM              // 中等邊框風格
Constants::BORDER_DASHED              // 虛線邊框風格
Constants::BORDER_DOTTED              // 虛線邊框樣式
Constants::BORDER_THICK               // 厚邊框風格
Constants::BORDER_DOUBLE              // 雙邊風格
Constants::BORDER_HAIR                // 頭髮邊框樣式
Constants::BORDER_MEDIUM_DASHED       // 中等虛線邊框樣式
Constants::BORDER_DASH_DOT            // 短劃線邊框樣式
Constants::BORDER_MEDIUM_DASH_DOT     // 中等點劃線邊框樣式
Constants::BORDER_DASH_DOT_DOT        // Dash-dot-dot邊框樣式
Constants::BORDER_MEDIUM_DASH_DOT_DOT // 中等點劃線邊框樣式
Constants::BORDER_SLANT_DASH_DOT      // 傾斜的點劃線邊框風格
  • 4.align(…$align) 對齊

    Constants::ALIGN_LEFT,
    Constants::ALIGN_CENTER,
    Constants::ALIGN_RIGHT,
    Constants::ALIGN_FILL,
    Constants::ALIGN_JUSTIFY,
    Constants::ALIGN_CENTER_ACROSS,
    Constants::ALIGN_DISTRIBUTED,
    Constants::ALIGN_VERTICAL_TOP,
    Constants::ALIGN_VERTICAL_BOTTOM,
    Constants::ALIGN_VERTICAL_CENTER,
    Constants::ALIGN_VERTICAL_JUSTIFY,
    Constants::ALIGN_VERTICAL_DISTRIBUTED
    分別對應
    Format::FORMAT_ALIGN_LEFT;                 // 水平左對齊
    Format::FORMAT_ALIGN_CENTER;               // 水平劇中對齊
    Format::FORMAT_ALIGN_RIGHT;                // 水平右對齊
    Format::FORMAT_ALIGN_FILL;                 // 水平填充對齊
    Format::FORMAT_ALIGN_JUSTIFY;              // 水平兩端對齊
    Format::FORMAT_ALIGN_CENTER_ACROSS;        // 橫向中心對齊
    Format::FORMAT_ALIGN_DISTRIBUTED;          // 分散對齊
    Format::FORMAT_ALIGN_VERTICAL_TOP;         // 頂部垂直對齊
    Format::FORMAT_ALIGN_VERTICAL_BOTTOM;      // 底部垂直對齊
    Format::FORMAT_ALIGN_VERTICAL_CENTER;      // 垂直劇中對齊
    Format::FORMAT_ALIGN_VERTICAL_JUSTIFY;     // 垂直兩端對齊
    Format::FORMAT_ALIGN_VERTICAL_DISTRIBUTED; // 垂直分散對齊
  • 5.font($fontName) 字型 引數:字型名稱 字型必須存在於本機

  • 6.fontColor($fontColor) 設定字型顏色 接收引數:常量或RGB16進位制引數
    可選常量如

 const COLOR_BLACK = \Vtiful\Kernel\Format::COLOR_BLACK; 
 const COLOR_BROWN = \Vtiful\Kernel\Format::COLOR_BROWN; 
 const COLOR_BLUE = \Vtiful\Kernel\Format::COLOR_BLUE; 
 const COLOR_CYAN = \Vtiful\Kernel\Format::COLOR_CYAN; 
 const COLOR_GRAY = \Vtiful\Kernel\Format::COLOR_GRAY; 
 const COLOR_LIME = \Vtiful\Kernel\Format::COLOR_LIME; 
 const COLOR_GREEN = \Vtiful\Kernel\Format::COLOR_GREEN; 
 const COLOR_YELLOW = \Vtiful\Kernel\Format::COLOR_YELLOW; 
 const COLOR_WHITE = \Vtiful\Kernel\Format::COLOR_WHITE; 
 const COLOR_SILVER = \Vtiful\Kernel\Format::COLOR_SILVER; 
 const COLOR_RED = \Vtiful\Kernel\Format::COLOR_RED; 
 const COLOR_PURPLE = \Vtiful\Kernel\Format::COLOR_PURPLE; 
 const COLOR_PINK = \Vtiful\Kernel\Format::COLOR_PINK; 
 const COLOR_ORANGE = \Vtiful\Kernel\Format::COLOR_ORANGE; 
 const COLOR_NAVY = \Vtiful\Kernel\Format::COLOR_NAVY; 
 const COLOR_MAGENTA = \Vtiful\Kernel\Format::COLOR_MAGENTA;
  • 7.background($backgroundColor, [$pattern]) 設定背景顏色

pattern 可選引數

\Lysice\XlsWriter\Supports\Constants
const PATTERN_NONE = \Vtiful\Kernel\Format::PATTERN_NONE; 
const PATTERN_SOLID = \Vtiful\Kernel\Format::PATTERN_SOLID; 
const PATTERN_MEDIUM_GRAY = \Vtiful\Kernel\Format::PATTERN_MEDIUM_GRAY; 
const PATTERN_DARK_GRAY = \Vtiful\Kernel\Format::PATTERN_DARK_GRAY; 
const PATTERN_LIGHT_GRAY = \Vtiful\Kernel\Format::PATTERN_LIGHT_GRAY; 
const PATTERN_DARK_HORIZONTAL = \Vtiful\Kernel\Format::PATTERN_DARK_HORIZONTAL; const PATTERN_DARK_VERTICAL = \Vtiful\Kernel\Format::PATTERN_DARK_VERTICAL; 
const PATTERN_DARK_DOWN = \Vtiful\Kernel\Format::PATTERN_DARK_DOWN; 
const PATTERN_DARK_UP = \Vtiful\Kernel\Format::PATTERN_DARK_UP; 
const PATTERN_DARK_GRID = \Vtiful\Kernel\Format::PATTERN_DARK_GRID; 
const PATTERN_DARK_TRELLIS = \Vtiful\Kernel\Format::PATTERN_DARK_TRELLIS; 
const PATTERN_LIGHT_HORIZONTAL = \Vtiful\Kernel\Format::PATTERN_LIGHT_HORIZONTAL; 
const PATTERN_LIGHT_VERTICAL = \Vtiful\Kernel\Format::PATTERN_LIGHT_VERTICAL; const PATTERN_LIGHT_DOWN = \Vtiful\Kernel\Format::PATTERN_LIGHT_DOWN; 
const PATTERN_LIGHT_UP = \Vtiful\Kernel\Format::PATTERN_LIGHT_UP; 
const PATTERN_LIGHT_GRID = \Vtiful\Kernel\Format::PATTERN_LIGHT_GRID; 
const PATTERN_LIGHT_TRELLIS = \Vtiful\Kernel\Format::PATTERN_LIGHT_TRELLIS; 
const PATTERN_GRAY_125 = \Vtiful\Kernel\Format::PATTERN_GRAY_125; 
const PATTERN_GRAY_0625 = \Vtiful\Kernel\Format::PATTERN_GRAY_0625;
  • 8.fontSize($size) 字型大小

  • 9.number($format) 設定數字格式

數字格式可選引數

 "0.000", "#,##0", "#,##0.00", "0.00"
  • 10.underline() 設定下劃線

  • 11.wrap() 設定單元格換行

  • 12.strikeout() 設定刪除線

8.工作表縮放

  • 實現WithZoom介面 注意 返回值需在10-400之間.
    public function zoom() { 
       return 300; 
    }

    9.工作表網格線

  • 實現WithGridLine介面
    public function gridLine() {
       return Constants::GRIDLINES_HIDE_ALL; 
    }

引數可選:\Lysice\XlsWriter\Supports\Constants

- const GRIDLINES_HIDE_ALL    = 0; // 隱藏列印網格線 和 文件網格線
- const GRIDLINES_SHOW_SCREEN = 1; // 顯示網格線
- const GRIDLINES_SHOW_PRINT  = 2; // 顯示列印網格線
- const GRIDLINES_SHOW_ALL    = 3; // 顯示列印網格線與文件網格線

10.行模式

開啟xlswriter的行模式,設定config/xlswriter.php

'export_mode' => Excel::EXPORT_MODE_ROW

則文件會一行一行匯出。

10.1 設定列樣式

開啟行模式後, 可以設定每列單元格的樣式

  • 1.實現契約
    implements WithColumnFormat
  • 2.實現介面方法 columnFormats
    /**
    * @return array * @throws \Lysice\XlsWriter\Exceptions\FormatParamErrorException */ 
    public function columnFormats() {
      $formatOne = ColumnFormat::create()
          ->setCellType(CellConstants::CELL_TYPE_TEXT)
          ->border(12) 
          ->background(\Lysice\XlsWriter\Supports\Constants::COLOR_MAGENTA); 
      $formatTwo = ColumnFormat::create() 
          ->setOptions(['dateFormat' => "mm/dd/yy"])
          ->setCellType(CellConstants::CELL_TYPE_DATE) 
          ->underline( \Lysice\XlsWriter\Supports\Constants::UNDERLINE_SINGLE) 
          ->wrap();
       $formatThree = ColumnFormat::create() 
          ->setCellType(CellConstants::CELL_TYPE_FORMULA) 
          ->italic() 
          ->fontSize(12);
      $formatFour = ColumnFormat::create() 
          ->setOptions([ 'widthScale' => 1.1, 'heightScale' => 1.1 ])
          ->setCellType(CellConstants::CELL_TYPE_IMAGE) 
          ->border(1); 
      $formatFive = ColumnFormat::create() 
       ->setCellType(CellConstants::CELL_TYPE_URL) 
       ->border(1); 
       return [$formatOne, $formatTwo, $formatThree, $formatFour, $formatFive]; 
    }
    ColumnFormat方法返回ColumnFormat物件的陣列。
    ColumnFormat物件 繼承自DefaultFormat, 所以可以支援所有格式。
    當前支援5種格式,定義在ColumnFormat 中:
    class ColumnFormat extends DefaultFormat {
      public $cellTypes = [ 
          CellConstants::CELL_TYPE_TEXT, // 文字格式
          CellConstants::CELL_TYPE_DATE, // 日期格式 
          CellConstants::CELL_TYPE_FORMULA, // 公式格式
          CellConstants::CELL_TYPE_IMAGE, // 圖片格式
          CellConstants::CELL_TYPE_URL, // url格式
       ];
    ......
    }
    注意 要設定單元格格式時,若未指定 CellType 則會預設按照 CELL_TYPE_TEXT 文字格式來處理。
  • 1.文字格式
    $formatOne = ColumnFormat::create()
      ->setCellType(CellConstants::CELL_TYPE_TEXT)
      ->border(12) 
      ->background(\Lysice\XlsWriter\Supports\Constants::COLOR_MAGENTA);
  • 2.日期格式 可以設定選項 日期格式,通過setOptions來實現。如下程式碼
    $formatTwo = ColumnFormat::create()
      ->setOptions(['dateFormat' => "mm/dd/yy"])
      ->setCellType(CellConstants::CELL_TYPE_DATE) 
      ->underline( \Lysice\XlsWriter\Supports\Constants::UNDERLINE_SINGLE) 
      ->wrap();
  • 3.公式格式
    $formatThree = ColumnFormat::create()
      ->setCellType(CellConstants::CELL_TYPE_FORMULA) 
      ->italic()
      ->fontSize(12);
  • 4.圖片格式, 可以設定縮放比例。通過setOptions來實現。如下程式碼
    $formatFour = ColumnFormat::create()
      ->setOptions([ 'widthScale' => 1.1, 'heightScale' => 1.1 ]) 
      ->setCellType(CellConstants::CELL_TYPE_IMAGE) 
      ->border(1);
  • 5.URL格式 可以設定文字與提示 ,由於每行的提示文字 urlTooltip urlText不一樣,因此該資料只能在要匯入的資料中定義。
    如下資料定義:
    return [
    ['aaa',time(), '=SUM(A2:A3)',public_path('1.jpeg'), 'http://www.baidu.com', 'urlText' => '連結文字1', 'urlTooltip' => '連結提示1'],
    ['aaa',time(), '=SUM(A2:A3)',public_path('1.jpeg'), 'http://www.baidu.com', 'urlText' => '連結文字2', 'urlTooltip' => '連結提示2'],
    ['aaa',time(), '=SUM(A2:A3)',public_path('1.jpeg'), 'http://www.baidu.com', 'urlText' => '連結文字3', 'urlTooltip' => '連結提示3'],
    ['aaa',time(), '=SUM(A2:A3)',public_path('1.jpeg'), 'http://www.baidu.com', 'urlText' => '連結文字4', 'urlTooltip' => '連結提示4'],
    ['aaa',time(), '=SUM(A2:A3)',public_path('1.jpeg'), 'http://www.baidu.com', 'urlText' => '連結文字5', 'urlTooltip' => '連結提示5'],
    ];
    以上第五列的單元格的文字會被設定成 urlText的值。
    $formatFive = ColumnFormat::create()
      ->setCellType(CellConstants::CELL_TYPE_URL)
      ->border(1);
    在此感謝 xlswriter的開發者viest
    如有什麼問題可以及時反饋到github哦。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章