avadim/fast-excel-laravel

轻量级且非常快的Laravel XLSX电子表格导出/导入

v2.7.0 2024-05-19 18:43 UTC

This package is auto-updated.

Last update: 2024-09-13 07:38:44 UTC


README

轻量级且非常快的Laravel XLSX电子表格读写库(基于纯PHP的FastExcelWriterFastExcelReader

简介

从您的Laravel应用程序中导出数据从未如此快速!将模型导入到您的Laravel应用程序中从未如此简单!

此库是围绕avadim/fast-excel-writeravadim/fast-excel-reader构建的包装器,因此它也是轻量级、快速且占用内存最少。使用此库,您可以从Laravel应用程序中将数组、集合和模型导出到XLSX文件,并可以将数据导入到Laravel应用程序中。

特性

  • 轻松将模型、集合和数组导出到Excel
  • 以非常快且使用最少内存的方式导出大型数据集
  • 可以创建多个工作表,并支持基本的列、行和单元格样式
  • 您可以设置行的宽度和列的宽度(包括自动宽度计算)
  • 非常快且内存使用量最少地将工作簿和工作表导入到Eloquent模型中
  • 从导入的表头自动检测字段
  • 映射导入/导出数据
  • 支持自动格式化器和自定义格式化器导入数据的日期时间值
  • 库可以定义和从XLSX文件中提取图像
  • 您可以向输出XLSX文件添加活动超链接、公式、注释、图表和图像
  • 支持带/不带密码的工作簿和工作表保护
  • 支持页面设置 - 页边距、页面大小

安装

通过composer安装

composer require avadim/fast-excel-laravel

然后您可以使用外观Excel

// Create workbook...
$excel = \Excel::create();

// export model...
$excel->sheet()->withHeadings()->exportModel(Users::class);

// and save XLSX-file to default storage
$excel->saveTo('path/file.xlsx');

// or save file to specified disk
$excel->store('disk', 'path/file.xlsx');

// Open saved workbook
$excel = \Excel::open(storage_path('path/file.xlsx'));

// import records to database
$excel->withHeadings()->importModel(User::class);

跳转到

导出数据

导出模型

轻松快速地导出模型。这样,您可以只导出模型数据,不带标题和任何样式

// Create workbook with sheet named 'Users'
$excel = \Excel::create('Users');

// Export all users to Excel file
$sheet->exportModel(Users::class);

$excel->saveTo('path/file.xlsx');

以下代码将字段名称和样式(字体和边框)写入第一行,然后导出User模型的所有数据

// Create workbook with sheet named 'Users'
$excel = \Excel::create('Users');

// Write users with field names in the first row
$sheet->withHeadings()
    ->applyFontStyleBold()
    ->applyBorder('thin')
    ->exportModel(Users::class);

$excel->saveTo('path/file.xlsx');

映射导出数据

您可以将需要添加为行的数据映射

$sheet = $excel->getSheet();
$sheet->mapping(function($model) {
    return [
        'id' => $model->id, 'date' => $model->created_at, 'name' => $model->first_name . $model->last_name,
    ];
})->exportModel(User::class);
$excel->save($testFileName);

导出任何集合和数组

// Create workbook with sheet named 'Users'
$excel = \Excel::create('Users');

$sheet = $excel->getSheet();
// Get users as collection
$users = User::where('age', '>', 35)->get();

// Write attribute names
$sheet->writeRow(array_keys(User::getAttributes()));

// Write all selected records
$sheet->writeData($users);

$sheet = $excel->makeSheet('Records');
// Get collection of records using Query Builder
$records = \DB::table('users')->where('age', '>=', 21)->get(['id', 'name', 'birthday']);
$sheet->writeData($records);

$sheet = $excel->makeSheet('Collection');
// Make custom collection of arrays
$collection = collect([
    [ 'id' => 1, 'site' => 'google.com' ],
    [ 'id' => 2, 'site.com' => 'youtube.com' ],
]);
$sheet->writeData($collection);

$sheet = $excel->makeSheet('Array');
// Make array and write to sheet
$array = [
    [ 'id' => 1, 'name' => 'Helen' ],
    [ 'id' => 2, 'name' => 'Peter' ],
];
$sheet->writeData($array);

$sheet = $excel->makeSheet('Callback');
$sheet->writeData(function () {
    foreach (User::cursor() as $user) {
        yield $user;
    }
});

数据导出的高级用法

有关avadim/fast-excel-writer的详细文档,请参阅此处:https://github.com/aVadim483/fast-excel-writer/tree/master#readme

$excel = \Excel::create('Users');
$sheet = $excel->getSheet();

// Set column B to 12
$sheet->setColWidth('B', 12);
// Set options for column C
$sheet->setColOptions('C', ['width' => 12, 'text-align' => 'center']);
// Set column width to auto
$sheet->setColWidth('D', 'auto');

$title = 'This is demo of avadim/fast-excel-laravel';
// Begin area for direct access to cells
$area = $sheet->beginArea();
$area->setValue('A2:D2', $title)
      ->applyFontSize(14)
      ->applyFontStyleBold()
      ->applyTextCenter();
      
// Write headers to area, column letters are case independent
$area
    ->setValue('a4:a5', '#')
    ->setValue('b4:b5', 'Number')
    ->setValue('c4:d4', 'Movie Character')
    ->setValue('c5', 'Birthday')
    ->setValue('d5', 'Name')
;

// Apply styles to headers
$area->withRange('a4:d5')
    ->applyBgColor('#ccc')
    ->applyFontStyleBold()
    ->applyOuterBorder('thin')
    ->applyInnerBorder('thick')
    ->applyTextCenter();
    
// Write area to sheet
$sheet->writeAreas();

// You can set value formats for some fields
$sheet->setFieldFormats(['birthday' => '@date', 'number' => '@integer']);

// Write data to sheet
$sheet->writeData($data);

// Save XLSX-file
$excel->saveTo($testFileName);

导入数据

导入模型

要导入模型,您可以使用方法importModel()。如果第一行包含字段名称,则可以使用方法withHeadings()应用这些名称

import.jpg

// Open XLSX-file 
$excel = Excel::open($file);

// Import a workbook to User model using the first row as attribute names
$excel->withHeadings()->importModel(User::class);

// Done!!!

您可以从列或单元格定义要导入的列或单元格

// Import row to User model from columns range A:B - only 'name' and 'birthday'
$excel->withHeadings()->importModel(User::class, 'A:B');

import2.jpg

// Import from cells range
$excel->withHeadings()->importModel(User::class, 'B4:D7');

// Define top left cell only
$excel->withHeadings()->importModel(User::class, 'B4');

在最后两个示例中,我们还假设导入数据的第一行(第4行)是属性名称。

映射导入数据

但是,您可以自己设置列与字段名称之间的对应关系。

// Import row to User model from columns range B:E
$excel->mapping(function ($record) {
    return [
        'id' => $record['A'], 'name' => $record['B'], 'birthday' => $record['C'], 'random' => $record['D'],
    ];
})->importModel(User::class, 'B:D');

// Define top left cell only
$excel->mapping(['B' => 'name', 'C' => 'birthday', 'D' => 'random'])->importModel(User::class, 'B5');

// Define top left cell only (shorter way)
$excel->importModel(User::class, 'B5', ['B' => 'name', 'C' => 'birthday', 'D' => 'random']);

数据导入的高级用法

有关avadim/fast-excel-reader的详细文档,请参阅此处:https://github.com/aVadim483/fast-excel-reader/tree/master#readme

$excel = Excel::open($file);

$sheet = $excel->getSheet('Articles');
$sheet->setReadArea('B5');
foreach ($sheet->nextRow() as $rowNum => $rowData) {
    $user = User::create([
        'name' => $rowData['B'],
        'birthday' => new \Carbon($rowData['C']),
        'password' => bcrypt($rowData['D']),
    ]);
    Article::create([
        'user_id' => $user->id,
        'title' => $rowData['E'],
        'date' => new \Carbon($rowData['F']),
        'public' => $rowData['G'] === 'yes',
    ]);
}

更多特性

您可以在FastExcelWriter的文档中查看更多导出特性。

您可以在FastExcelReader的文档中查看更多导入功能

您想支持FastExcelLaravel吗?

如果您觉得这个包很有用,您可以支持并捐款给我一杯咖啡

  • USDT (TRC20) TSsUFvJehQBJCKeYgNNR1cpswY6JZnbZK7
  • USDT (ERC20) 0x5244519D65035aF868a010C2f68a086F473FC82b
  • ETH 0x5244519D65035aF868a010C2f68a086F473FC82b

或者直接在GitHub上给我一个star :)