Laravel-xlswriter 一款基於xlswriter的laravel擴充套件包
php-xlswriter
是一款高效能的excel讀寫擴充套件,laravel-xlswriter
基於該擴充套件做了封裝,旨在提供一個便於使用的xlswriter
的laravel
工具包。
目前laravel-xlswriter
支援匯出 讀取功能會在後續版本中加入。
laravel-xlswriter文件
PHP擴充套件Xlswriter文件
如果本擴充套件幫助到了你 歡迎star。
如果本擴充套件有任何問題或有其他想法 歡迎提 issue與pull request。
一、XlsWriter擴充套件介紹
XlsWriter
是viest
開發的一款PHP擴充套件,目前github
的 star
數已達到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.7PHP
> 7.0
安裝請按照XlsWriter
的官方文件:安裝教程
安裝
composer require lysice/laravel-xlswriter
將ServiceProvider
加入到app.php中:
'providers' => [
/* * Laravel Framework Service Providers... */
...
\Lysice\XlsWriter\XlsWriterServiceProvider::class
],
釋出Facade
將Excel
加入到app.php中:
'aliases' => [
...
'Excel' => \Lysice\XlsWriter\Facade\Writer::class
],
釋出xlswriter.php
配置檔案:
php artisan vendor:publish --provider="Lysice\XlsWriter\XlsWriterServiceProvider"
配置
本擴充套件提供如下幾個選項:extension
: 匯出文件的副檔名 目前只支援xlsx與csvmode
: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
的實體類來下載文件:
目前支援兩個方法:download
與store
。
- 下載到本地
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.新增樣式
該方法返回一個DefaultFormat物件陣列,當DefaultFormat數量為1時 預設為內容設定樣式。若=2 則以陣列0作為header樣式, 以陣列1的物件作為內容樣式。/** * @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]; }
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 協議》,轉載必須註明作者和本文連結